java学习笔记之多线程
2016-11-24 16:39
281 查看
线程是比进程更小的执行单位,一个进程可以划分为多个线程。对于多线程的内存解释,线程没有独立的内存空间,而是与所属的进程中的其他线程共享一个内存空间,每个线程栈中实现先进后出。
每个java程序都有一个默认的主线程,一般来说main方法执行的线程就是主线程。
一、如何创建线程
通过查阅API可以知道创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run方法。接下来可以分配并启动该子类的实例。
第一步:继承Thread类
第二步:覆盖run方法,自定义线程的任务代码都存储在run方法中。
第三步:创建子类对象
第四部:start方法--->使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
运行结果是:
Thread-0----First----0
Thread-0----First----1
main----1
Thread-0----First----2
Thread-1----Second----0
Thread-0----First----3
main----2
Thread-0----First----4
Thread-0----First----5
Thread-1----Second----1
Thread-1----Second----2
Thread-1----Second----3
Thread-1----Second----4
main----3
Thread-1----Second----5
main----4
每次运行的结果都不同,从运行结果可以看出,线程的执行具有不确定性,是由于CPU切换的随意性导致的。CPU在main线程,Thread-0线程和Thread-1线程之间切换执行。
创建线程的另一种方法是声明实现
实现Runnable接口创建线程的好处是:
1、避免了单继承的局限性
2、Runnable接口的出现更符合面向对象,将线程单独进行对象的封装
3、Runnable接口的出现,降低了线程对象和线程任务的耦合性
综上所述,创建线程一般使用方式二。
二、线程的生命周期
线程的一个完整的声明周期要经历五种状态:新建、临时阻塞、运行、冻结和消亡。
就绪:新建线程被启动时或者是阻塞状态的线程被解除阻塞后,就进入线程队列等待系统为它分配CPU资源。每个线程在就绪的时候,线程具备CPU的执行权,但不具备执行资源,处于等待状态。
运行:处于就绪状态的线程获得CPU执行资源后,进入运行状态。
下图为各个状态的关系图
每个java程序都有一个默认的主线程,一般来说main方法执行的线程就是主线程。
一、如何创建线程
通过查阅API可以知道创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run方法。接下来可以分配并启动该子类的实例。
第一步:继承Thread类
第二步:覆盖run方法,自定义线程的任务代码都存储在run方法中。
第三步:创建子类对象
第四部:start方法--->使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
public class ThreadDemo2 extends Thread { private String name; ThreadDemo2(String name){ this.name=name; } public void run(){ for(int x=0;x<=5;x++){ System.out.println(Thread.currentThread().getName()+"----"+name+"----"+x); } } } public class ThreadTest2 { public static void main(String[] args) { ThreadDemo2 td1 = new ThreadDemo2("First"); ThreadDemo2 td2 = new ThreadDemo2("Second"); td1.start(); td2.start(); for(int x=1;x<5;x++){ System.out.println(Thread.currentThread().getName()+"----"+x); // 该部分是被主线程执行的代码 } } }
运行结果是:
Thread-0----First----0
Thread-0----First----1
main----1
Thread-0----First----2
Thread-1----Second----0
Thread-0----First----3
main----2
Thread-0----First----4
Thread-0----First----5
Thread-1----Second----1
Thread-1----Second----2
Thread-1----Second----3
Thread-1----Second----4
main----3
Thread-1----Second----5
main----4
每次运行的结果都不同,从运行结果可以看出,线程的执行具有不确定性,是由于CPU切换的随意性导致的。CPU在main线程,Thread-0线程和Thread-1线程之间切换执行。
创建线程的另一种方法是声明实现
Runnable接口的类。该类然后实现
run方法。然后可以分配该类的实例,在创建
Thread时作为一个参数来传递并启动。
public class ThreadDemo3 implements Runnable{ private String name; ThreadDemo3(String name){ this.name=name; } public void run(){ for(int x=0;x<=5;x++){ System.out.println(name+"----"+x); } } } public class ThreadTest3 { public static void main(String[] args) { ThreadDemo3 td1 = new ThreadDemo3("First"); ThreadDemo3 td2 = new ThreadDemo3("Second"); //new Thread(td1).start();//ThreadDemo3已经不是线程对象,没有线程子类 //new Thread(td2).start(); Thread t1=new Thread(td1);//Thread类中有一个构造函数,可以传入Runnable接口类型的对象,如下图所示 Thread t2=new Thread(td2); t1.start(); t2.start(); for(int x=1;x<5;x++){ System.out.println(Thread.currentThread().getName()+"----"+x); } } }
实现Runnable接口创建线程的好处是:
1、避免了单继承的局限性
2、Runnable接口的出现更符合面向对象,将线程单独进行对象的封装
3、Runnable接口的出现,降低了线程对象和线程任务的耦合性
综上所述,创建线程一般使用方式二。
二、线程的生命周期
线程的一个完整的声明周期要经历五种状态:新建、临时阻塞、运行、冻结和消亡。
就绪:新建线程被启动时或者是阻塞状态的线程被解除阻塞后,就进入线程队列等待系统为它分配CPU资源。每个线程在就绪的时候,线程具备CPU的执行权,但不具备执行资源,处于等待状态。
运行:处于就绪状态的线程获得CPU执行资源后,进入运行状态。
下图为各个状态的关系图
相关文章推荐
- java学习笔记(九)----多线程
- Java多线程学习笔记1
- java多线程学习笔记2
- java多线程学习笔记3
- JAVA学习笔记之多线程
- Java学习笔记(五、多线程)
- [零散篇]Java学习笔记---Java的Socket网络编程以及多线程
- Java 多线程编程 学习笔记
- JAVA多线程学习笔记
- 学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信
- 学习java多线程的笔记4--传智播客_张孝祥_空中网挑选实习生的面试题(来源于视频)
- 学习java多线程的笔记5--初体验
- 学习笔记 java 多线程(二)
- 学习笔记 java多线程(四)线程间协作
- 训练营学习笔记 java多线程(五)生产者/消费者
- 学习笔记 java多线程 信号量(Semaphore),死锁
- JAVA多线程学习笔记—1
- Java学习笔记9——多线程
- java学习笔记1017---多线程
- Java多线程学习笔记