多线程(一)初识多线程

一.环境

  idea

二.为什么使用多线程

俗话说:众人拾柴火焰高。为什么不让一个人去拾柴呢!!!当然是团结啦!!但是最总要的是提高效率

所以在程序中也是一样,你可以讲一个线程看做一个人,为了加快程序效率就出现了多线程。

三.什么是线程

面试题:线程和进程的区别是什么

答:线程是程序的一条运行途径,进程是一个线程集合

四.创建线程的方式

多线程执行我们默认忽略极小误差默认是同时执行的,关于谁先执行就看谁能先强到CPU的执行权

4.1实现Thread类

public class ThreadTest extends Thread {

    //重写Thread类型的run方法
    @Override
    public void run() {
        System.out.println("子线程运行-------");
        //线程执行的逻辑代码
        for(int i=0;i<20;i++){
            System.out.println(getName()+"i:"+i);
        }
        System.out.println("线程结束");
    }

}

创建测试类

public static void main(String[] args) {
        ThreadTest threadTest=new ThreadTest();//创建线程
        threadTest.start();//启动线程

        for(int i=0;i<20;i++){
            System.out.println(Thread.currentThread().getName()+"i:"+i);//主线程需要运行的代码
        }
    }

为什么不使用thread.run()方法启动多线程:由于我们创建线程和普通的new对象一样当使用run方法就相当于调用方法,而不是启动多线程了

4.2继承Runnable接口

public class ThreadTest implements Runnable {
    //重写Thread类型的run方法

    public void run() {
        System.out.println("子线程运行-------");
        //线程执行的逻辑代码
        for(int i=0;i<20;i++){
            System.out.println(Thread.currentThread().getName()+"i:"+i);
        }
        System.out.println("线程结束");
    }

}

创建测试类

 public static void main(String[] args) {
        ThreadTest threadTest=new ThreadTest();//创建线程
        Thread thread=new Thread(threadTest);
        thread.start();//启动线程

        for(int i=0;i<20;i++){
            System.out.println(Thread.currentThread().getName()+"i:"+i);//主线程需要运行的代码
        }
    }

拿这种方式和上一中来比较,可以看出来两种方式创建线程的方式不同

面试题:通常创建线程是使用继承Thred类好还是实现Runnable接口好

答:实现Runnable接口好,因为Java只支持单继承,但是支持多实现

4.3使用匿名内部类的方式创建多线程

 public static void main(String[] args) {
        Thread thread=new Thread(new Runnable() {//匿名内部类
            public void run() {//业务逻辑代码
                for (int i=0;i<20;i++){
                    System.out.println(Thread.currentThread().getName()+"子线程i:"+i);
                }
            }
        });
        thread.start();
        for (int i=0;i<20;i++){//主线程逻辑代码处
            System.out.println(Thread.currentThread().getName()+"i:"+i);
        }
    }

4.4多线程常用API


常用线程api方法


start()


启动线程


currentThread()


获取当前线程对象


getID()


获取当前线程ID      Thread-编号  该编号从0开始


getName()


获取当前线程名称


sleep(long mill)


休眠线程


Stop()


停止线程,


常用线程构造函数


Thread()


分配一个新的 Thread 对象


Thread(String name)


分配一个新的 Thread对象,具有指定的 name正如其名。


Thread(Runable r)


分配一个新的 Thread对象


Thread(Runable r, String name)


分配一个新的 Thread对象

五.多线程的几种状态的相互转换

5.1新建状态

当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码

5.2就绪状态

一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。

处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(thread scheduler)来调度的。

5.3运行状态

当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法.

5.4阻塞状态

线程运行过程中,可能由于各种原因进入阻塞状态:
        1>线程通过调用sleep方法进入睡眠状态;
        2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
        3>线程试图得到一个锁,而该锁正被其他线程持有;
        4>线程在等待某个触发条件;

5.5死亡状态

有两个原因会导致线程死亡:
  1) run方法正常退出而自然死亡,
   2) 一个未捕获的异常终止了run方法而使线程猝死。
  为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.

六.join()方法的作用

调用那个线程的join()方法就是,需要当那个线程执行完后再执行当前线程

例如:

 public static void main(String[] args) {
        final Thread thread1=new Thread(new Runnable() {//匿名内部类
            public void run() {//业务逻辑代码
                for (int i=0;i<20;i++){
                    System.out.println(Thread.currentThread().getName()+"子线程i:"+i);
                }
            }
        });
        Thread thread2=new Thread(new Runnable() {//匿名内部类

            public void run() {//业务逻辑代码
                try {
                    thread1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int i=0;i<20;i++){
                    System.out.println(Thread.currentThread().getName()+"子线程i:"+i);
                }
            }
        });
        thread2.start();
        thread1.start();

    }

结果:不加thread1.join()

加入thread1.join()

原文地址:https://www.cnblogs.com/wy0119/p/8998976.html

时间: 2024-10-17 22:00:30

多线程(一)初识多线程的相关文章

java学习笔记之初识多线程

初识多线程 一.进程的认识: 1.进程的理解: 进程可以理解成正在执行的任务,就是正在运行的程序,进程又分为两种,一种是前台进程,就是我们很直观看见的,另一种是后台进程,就是操作系统启动就有的(系统级的进程),每个进程运行之后都会占用一定的cpu和内存资源: 比如说:我们打开window任务管理器就可以看到有很多的进程,里面有用户开启的,也有操作系统启动的进程 2.进程的调度: 也就是那么多的进程,cpu是怎样运行的呢? 采用时间片轮转法 二.线程认识 1.线程的理解 线程是在进程的内部运行的执

秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. ----------------------

C#多线程学习(一) 多线程的相关概念

什么是进程?    当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?    线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数. 什么是多线程?    多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务. 多线程的好处:    可以提

C#多线程学习(一) 多线程的相关概念(转)

什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数. 什么是多线程?多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务. 多线程的好处:可以提高CPU的利用率.在多线程程序中

秒杀多线程第一篇 多线程笔试面试题汇总

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. -------------------------------------华丽的分割线

python 多线程和C++多线程的区别

看到论坛上有人问python多线程和C++多线程的区别? 暖神是这样回答的: Python有Global Interpreter Lock,所以嘛……你懂的.C++11开始才有多线程,使用共享内存方式的线程间通信,有低级的atomic operation和memory order,以及高级的lock, condition的,却没有提供消息队列. 然后,就去找GIL(Global Interpreter Lock)的定义,下面有一个定义,wiki的定义是这样的.在stackoverflow上看到了

Unity3D游戏开发之多线程及使用多线程

Unity3D游戏开发之多线程及使用多线程 Unity3D中的多线程.线程是一个相当复杂的话题,但如果掌握了它,就可以从容的使用多个硬件处理器或处理很难划分管理数据块. 如在场景中用A*算法进行大量的数据计算,变形网格中操作大量的顶点,持续的要运行上传数据到服务器,二维码识别等图像处理,如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine. 线程是在程序中与其他线程同时运行的进行.在多处理器的计算机上可以做到多个线程的真正的同步,更多的线程取决于有多

详解多线程MT和多线程MD的区别

这段时间司在招实习生,而不管是远程的电话面试或者是实际现场面试中领导都喜欢问你这个问题,但是可惜的是能很好答上来的人很少.后来发现不管是应届的实习生,甚至有些实际参加工作几年的人也未必真的了解这个问题.今天想写一篇详解,希望对广大程序员有一定的帮助. 区别1:全局堆句柄不一样. 网上有一个说法,就是一个线程一个栈,一个模块一个堆.前者很容易有理解,每个线程创建的时候在CreateThread中都能制定默认栈大小,只是很多情况下都取了默认值.而一个模块一个堆呢?其实很简单测试,如果是一个多线程MT

多线程系列(1)多线程基础和Thread

因为现项目中有用到多线程和并发的知识,所以打算近期补习一下多线程相关的内容.第一篇文章从最基础的开始,就是如何开启一个线程,如何启动线程和阻塞线程等,这篇文章分以下几点进行总结. 多线程初印象 多线程的使用场景 线程的启动,挂起和终止 一个简单的多线程实例 多线程初印象 首先通过一张图来了解一下进程Process,应用程序域AppDomain和线程Thread之间的关系. 从图中可以总结出以下几点: 一个进程Process可能包含多个应用程序域,也包含多个线程,线程也可以穿梭于多个应用程序域当中

[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 多线程高级应用

[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 多线程高级应用 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET多线程中的高级应用. 主要有在线程资源共享中的线程安全和线程冲突的解决方案:多线程同步,使用线程锁和线程通知实现线程同步. 1. ThreadStatic特性 特性:[ThreadStatic] 功能:指定静态字段在不同线程中拥有不同的值 在此之前,我们先看一个多线程的示例: 我们定义一个静态字段: static