线程基本概念
2014-10-01 17:11
225 查看
线程基本概念
一、概念:
①进程:是指正在执行中的程序,每一个进程都有一个执行顺序,该顺序是一个执行路径或者叫控制单元。
②线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行。
注意:一个进程中最起码有一个线程
二、线程的两种定义方式
①方式一步骤:
I:定义类继承Thread
II:覆盖Thread类的run方法
III:创建Thread子类对象
IV:用Thread子类对象调用Thread类中的start方法
注意:thread类中run方法的两个作用:
1>、开启线程
2>、调用run方法
用法示例:
运行结果:
这时候,每次运行结果都不相同,因为多个线程都能获得CPU执行权,CPU执行到谁,谁就运行。但是在某一个时间点上,只有一个程序在运行(单核情况下),CPU在快速切换,以达到看上去是多个程序在同时运行。这里也可以理解为,多个线程在同时抢夺CPU执行权,这也是多线程的特点之一:随机性。谁抢到谁执行,执行多久,由CPU来决定。
覆盖run方法的原因:Thread用于描述线程,该类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。
②方法二步骤:
I:创建一个类实现Runnable接口
II:实现接口中的run方法
III:创建该类的对象
IV:创建Thread对象,并把Runnable子类对象作为参数传递给thread类构造方法
V:调用Thread对象的start方法开启线程。
用法示例:
③:实现方式与继承方式的区别:
实现的方式避免了java单继承的局限性,因此在建立线程时建议使用实现的方式。
区别:
实现:线程代码存在于Runnable接口子类的run方法中
继承:线程代码存在于Thread子类的run方法中
三、线程的常见方法:
①:currentThread() 获取当前线程对象,返回值类型为Thread,此为静态方法
②:getName() 获取线程名称,返回值类型为String
③:setName()设置线程名称,返回值为空,(此方法也可在构造函数中实现)
④:interrupt()中断线程。
⑤:join()等待该线程终止
⑥:sleep()使线程休眠,可以传入以毫秒为单位的参数
⑦:start()开启线程
四:线程的几种状态与互相转化关系
一、概念:
①进程:是指正在执行中的程序,每一个进程都有一个执行顺序,该顺序是一个执行路径或者叫控制单元。
②线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行。
注意:一个进程中最起码有一个线程
二、线程的两种定义方式
①方式一步骤:
I:定义类继承Thread
II:覆盖Thread类的run方法
III:创建Thread子类对象
IV:用Thread子类对象调用Thread类中的start方法
注意:thread类中run方法的两个作用:
1>、开启线程
2>、调用run方法
用法示例:
public class ThreadDemo { public static void main(String[] args) { //创建Thread子类对象 Thread1 first = new Thread1(); Thread1 secound = new Thread1(); //调用run方法 first.start(); secound.start(); } } //创建类继承Thread class Thread1 extends Thread{ int piao = 100; //覆盖父类run方法 public void run() { while(piao>0){ try { this.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.getName()+" is running"+piao); piao--; } } }
运行结果:
这时候,每次运行结果都不相同,因为多个线程都能获得CPU执行权,CPU执行到谁,谁就运行。但是在某一个时间点上,只有一个程序在运行(单核情况下),CPU在快速切换,以达到看上去是多个程序在同时运行。这里也可以理解为,多个线程在同时抢夺CPU执行权,这也是多线程的特点之一:随机性。谁抢到谁执行,执行多久,由CPU来决定。
覆盖run方法的原因:Thread用于描述线程,该类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。
②方法二步骤:
I:创建一个类实现Runnable接口
II:实现接口中的run方法
III:创建该类的对象
IV:创建Thread对象,并把Runnable子类对象作为参数传递给thread类构造方法
V:调用Thread对象的start方法开启线程。
用法示例:
public class ThreadDemo { public static void main(String[] args) { //实现的好处:可以避免单继承的局限性 //可以共享数据 // /* * 此时会出现买同一张票,是因为当first线程进入之后取到票的数量假如为98 * 在没有打印的时候,该线程失去执行权,second线程此时开始执行获得的票数也为98 * 此时任意一线程接着执行,就会出现卖出同一张票的情况 * * MaiPiao t = new MaiPiao(); Thread first = new Thread(t, "first"); Thread secound = new Thread(t, "secound"); first.start(); secound.start();*/
//建立runnable子类对象 MaiPiao t = new MaiPiao();
//将runnable子类对象作为参数传递给Thread的构造函数 Thread first = new Thread(t, "one"); Thread secound = new Thread(t, "two");
//调用Thread的start方法开启线程 first.start(); secound.start(); } }
//创建类实现Runable接口 class MaiPiao implements Runnable{ private int piao = 1000; Object obj = new Object();
//覆盖接口中的run方法 public void run() { while(true){ synchronized(obj){ if(piao>0){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" is running"+piao--); } } } } }
③:实现方式与继承方式的区别:
实现的方式避免了java单继承的局限性,因此在建立线程时建议使用实现的方式。
区别:
实现:线程代码存在于Runnable接口子类的run方法中
继承:线程代码存在于Thread子类的run方法中
三、线程的常见方法:
①:currentThread() 获取当前线程对象,返回值类型为Thread,此为静态方法
②:getName() 获取线程名称,返回值类型为String
③:setName()设置线程名称,返回值为空,(此方法也可在构造函数中实现)
④:interrupt()中断线程。
⑤:join()等待该线程终止
⑥:sleep()使线程休眠,可以传入以毫秒为单位的参数
⑦:start()开启线程
四:线程的几种状态与互相转化关系
相关文章推荐
- 【java多线程与并发库】---传统java多线程<1>线程基本概念
- 对线程基本概念的理解
- Java深度历险(三)——Java线程:基本概念、可见性与同步
- c#线程学习笔记一---基本概念
- day10 反射创建数组 线程的基本概念 线程的编写和启动方式 线程的运行状态以及状态转换方法 线程的调度和优先级设置
- 线程的基本概念、线程的基本状态?
- Java深度历险(三)——Java线程:基本概念、可见性与同步
- Java深度历险(三)——Java线程:基本概念、可见性与同步
- 线程基本概念
- MSDN中对进程和线程的一些基本概念的描述
- 线程---基本概念
- 线程的基本概念,线程的基本状态?
- 线程基本概念
- Java 线程的基本概念 创建方法 和 基本操作
- 孙鑫VC学习笔记:第十五讲 (一) 进程和线程基本概念
- 线程基本概念
- 【java多线程与并发库】---传统java多线程<1>线程基本概念
- -线程基本概念
- 多线程(一) 进程和线程的基本概念