多线程机制
7.1 线程的概念
7.2 Runnable接口与 Thread类
7.3 线程的控制与调度
7.4 线程的同步机制
7.1 线程的概念
程序、进程和线程
线程的生命周期与线程的状态创建、可运行、运行中、阻塞、死亡
日常生活中的程序、进程和线程程序:每学期的课程表进程:每学期的教学活动线程:每门课的教学过程
Runnable接口与 Thread类
Runnable接口
Thread类
例 7.1 继承 Thread类创建线程
例 7.2 实现 Runnable接口创建线程
两种创建线程方法的比较
线程组继承 Thread类创建线程
public class Thread1 extends Thread
{
int k=0;
public Thread1(String name,int k)
{
super(name);
this.k = k;
}
public void run() //覆盖 run方法的线程体
{
int i = k;
System.out.println();
System.out.print(getName()+",");
while (i<50)
{
System.out.print(i+" ");
i+=2;
}
System.out.println(getName() +" end!");
}
public static void main (String args[])
{
Thread1 t1 = new Thread1("Thread1",1);
//创建线程对象
Thread1 t2 = new Thread1("Thread2",2);
t1.start(); //启动执行线程
t2.start();
System.out.println("activeCount="+t2.activeCount());
}
}
例 7.1的运行结果
D:\myjava>javac Thread1.java
D:\myjava>java Thread1
activeCount=3
Thread1,1 3 5 7 9 11 13 15 17 19 21 23 25 27
Thread2,2 4 6 8 10 12 14 16 18 20 22 24 26 28
30 32 34 36 38 40 42 44 46 48 Thread2 end!
29 31 33 35 37 39 41 43 45 47 49 Thread1 end!
实现 Runnable接口创建线程
public class Runnable1 implements Runnable
{ int k=0;
public Runnable1(int k)
{ this.k = k;
}
public void run()
{ int i = k;
System.out.println();
while (i<50)
{ System.out.print(i+" ");
i+=2;
}
}
public static void main (String args[])
{
Runnable1 r1 = new Runnable1(1);
//创建具有线程体的目标对象
Runnable1 r2 = new Runnable1(2);
Thread t1=new Thread(r1);
//以目标对象创建线程
Thread t2=new Thread(r2);
t1.start();
t2.start();
}
}
例 7.2的运行结果
D:\myjava>javac Runnable1.java
D:\myjava>java Runnable1
1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
32 34 36 38 40 42 44 46 48
25 27 29 31 33 35 37 39 41 43 45 47 49
线程的控制与调度
7.3.1 线程的生命周期
7.3.2 线程调度与优先级
7.3.3 改变线程状态
1,线程睡眠 sleep() 例 7.3
2,暂停线程 yield()
3,连接线程 join()
4,中断线程 interrupt() 例 7.4
7.3.1 线程的生命周期
以就医过程为例说明
1,创建状态 (挂号 )
2,可运行状态 (等待就医 )
3,运行中状态 (医生诊病 )
4,阻塞状态 (仪器检查 )
5,死亡状态 (取药回家 )
7.3.2 线程调度与优先级
线程调度管理器(分诊处)
优先级(急诊、普通)
先到先服务
先占式调度模型
1,独占方式
2,分时方式线程睡眠
程序文本
运行结果
currentThread=main
getPriority = 5
activeCount=5
Group_Name isAlive()
main_main true
tg1_A true
tg1_B true
tg2_C true
tg2_D true
A sleep B sleep C sleep D sleep A end! B end! C end! D end!
例 7.4 改变线程状态线程的同步机制
线程间的制约关系,
1,互斥,排它性,火车上的厕所
2,同步,依赖性,接力赛
7.4.1 共享数据的线程“互斥”锁定
7.4.2 传送数据的线程同步运行
7.4.3 死锁问题共享数据的线程“互斥”
锁定
线程间的数据共享与出现的问题例 7.5 银行账户的存取款线程设计 运行结果比较
用关键字 synchronized实现互斥例 7.6 带锁定的存取款线程设计 运行结果传送数据的线程同步运行
线程间传送数据与出现的问题例 7.7 发送线程与接收线程程序与运行结果
synchrnized与“互斥锁标志”
在线程之间通信
java.lang.Object类的 wait,notify和 notifyAll
方法例 7.8 同步的发送线程与接收线程程序与运行结果用关键字 synchronized实现互斥
1,锁定一段代码 (一个资源 ):临界区
synchronized(对象名 )
{<语句 >}
2,锁定一段代码 (一个资源 ):临界区
synchronized<方法声明 >
{<方法体 >}
7.4.3 死锁问题
死锁的概念
日常生活中的死锁,打酒的故事 ;交通阻塞,
避免死锁的方法
例 7.9 发牌程序程序思想 程序文本
7.1 线程的概念
7.2 Runnable接口与 Thread类
7.3 线程的控制与调度
7.4 线程的同步机制
7.1 线程的概念
程序、进程和线程
线程的生命周期与线程的状态创建、可运行、运行中、阻塞、死亡
日常生活中的程序、进程和线程程序:每学期的课程表进程:每学期的教学活动线程:每门课的教学过程
Runnable接口与 Thread类
Runnable接口
Thread类
例 7.1 继承 Thread类创建线程
例 7.2 实现 Runnable接口创建线程
两种创建线程方法的比较
线程组继承 Thread类创建线程
public class Thread1 extends Thread
{
int k=0;
public Thread1(String name,int k)
{
super(name);
this.k = k;
}
public void run() //覆盖 run方法的线程体
{
int i = k;
System.out.println();
System.out.print(getName()+",");
while (i<50)
{
System.out.print(i+" ");
i+=2;
}
System.out.println(getName() +" end!");
}
public static void main (String args[])
{
Thread1 t1 = new Thread1("Thread1",1);
//创建线程对象
Thread1 t2 = new Thread1("Thread2",2);
t1.start(); //启动执行线程
t2.start();
System.out.println("activeCount="+t2.activeCount());
}
}
例 7.1的运行结果
D:\myjava>javac Thread1.java
D:\myjava>java Thread1
activeCount=3
Thread1,1 3 5 7 9 11 13 15 17 19 21 23 25 27
Thread2,2 4 6 8 10 12 14 16 18 20 22 24 26 28
30 32 34 36 38 40 42 44 46 48 Thread2 end!
29 31 33 35 37 39 41 43 45 47 49 Thread1 end!
实现 Runnable接口创建线程
public class Runnable1 implements Runnable
{ int k=0;
public Runnable1(int k)
{ this.k = k;
}
public void run()
{ int i = k;
System.out.println();
while (i<50)
{ System.out.print(i+" ");
i+=2;
}
}
public static void main (String args[])
{
Runnable1 r1 = new Runnable1(1);
//创建具有线程体的目标对象
Runnable1 r2 = new Runnable1(2);
Thread t1=new Thread(r1);
//以目标对象创建线程
Thread t2=new Thread(r2);
t1.start();
t2.start();
}
}
例 7.2的运行结果
D:\myjava>javac Runnable1.java
D:\myjava>java Runnable1
1 3 5 7 9 11 13 15 17 19 21 23
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
32 34 36 38 40 42 44 46 48
25 27 29 31 33 35 37 39 41 43 45 47 49
线程的控制与调度
7.3.1 线程的生命周期
7.3.2 线程调度与优先级
7.3.3 改变线程状态
1,线程睡眠 sleep() 例 7.3
2,暂停线程 yield()
3,连接线程 join()
4,中断线程 interrupt() 例 7.4
7.3.1 线程的生命周期
以就医过程为例说明
1,创建状态 (挂号 )
2,可运行状态 (等待就医 )
3,运行中状态 (医生诊病 )
4,阻塞状态 (仪器检查 )
5,死亡状态 (取药回家 )
7.3.2 线程调度与优先级
线程调度管理器(分诊处)
优先级(急诊、普通)
先到先服务
先占式调度模型
1,独占方式
2,分时方式线程睡眠
程序文本
运行结果
currentThread=main
getPriority = 5
activeCount=5
Group_Name isAlive()
main_main true
tg1_A true
tg1_B true
tg2_C true
tg2_D true
A sleep B sleep C sleep D sleep A end! B end! C end! D end!
例 7.4 改变线程状态线程的同步机制
线程间的制约关系,
1,互斥,排它性,火车上的厕所
2,同步,依赖性,接力赛
7.4.1 共享数据的线程“互斥”锁定
7.4.2 传送数据的线程同步运行
7.4.3 死锁问题共享数据的线程“互斥”
锁定
线程间的数据共享与出现的问题例 7.5 银行账户的存取款线程设计 运行结果比较
用关键字 synchronized实现互斥例 7.6 带锁定的存取款线程设计 运行结果传送数据的线程同步运行
线程间传送数据与出现的问题例 7.7 发送线程与接收线程程序与运行结果
synchrnized与“互斥锁标志”
在线程之间通信
java.lang.Object类的 wait,notify和 notifyAll
方法例 7.8 同步的发送线程与接收线程程序与运行结果用关键字 synchronized实现互斥
1,锁定一段代码 (一个资源 ):临界区
synchronized(对象名 )
{<语句 >}
2,锁定一段代码 (一个资源 ):临界区
synchronized<方法声明 >
{<方法体 >}
7.4.3 死锁问题
死锁的概念
日常生活中的死锁,打酒的故事 ;交通阻塞,
避免死锁的方法
例 7.9 发牌程序程序思想 程序文本