LOGO
Thread
多线程
Company Logowww.themegallery.com
前言本章内容是 Core Java的一个难点,如何设计一个安全、并发的多线程程序,对于一个程序员来说是一个比较有挑战性的任务,因为你要站在机器的角度去考虑问题。
到目前为止,大家写的 Application都是单线程程序,
也就是启动的 java程序在“同一时间”内只会做一件事。有时需要程序“同时”可以做很多事,即所谓多线程( Multi-thread)程序。在以后的
jsp/servlet学习中,了解多线程也是很重要的。
例,SingleThread.java
Company Logowww.themegallery.com
线程基本概念进程:应用程序,一个可执行的程序统称线程:一个轻量级的进程。一个进程可以有多个线程如何理解呢?
进程的公共部分(如成员变量)
进程中独立运行的线程
Company Logowww.themegallery.com
CPU
何时做
Code
做什么
Data
对什么做操作线程三要素
Java设计多线程程序的四种模式:
1、不共享代码,也不共享数据
2、共享代码,不共享数据
3、不共享代码,共享数据
4、既共享代码,也共享数据
IE
内存缓冲区迅雷下载资源
Company Logowww.themegallery.com
多线程的实现方式:
1、继承 java.lang.Thread类,并覆盖 run()
class A extends Thread{
public void run() { }
}
new A().start();
2、实现 java.lang.Runnable接口
class B implements Runnable{
public void run(){ }
}
new Thread( new B() ).start();
Company Logowww.themegallery.com
线程控制的基本方法
boolean isAlive() 判断线程是否还“活”着,即线程是否还未终止
Int getPriority()获得线程的优先级数值
void setPriority()设置线程的优先级数值
static void sleep( long millis)将当前线程睡眠指定毫秒数
void join() 调用某线程的该方法,将当前线程与该线程“合并”,即等待该线 程结束,在恢复当前线程的运行
static void yield()主动让出 cpu,当前线程进入就绪队列等待调度
void wait() 当前线程进入对象的 wait pool
void notify() /notifyAll( ) 唤醒对象的 wait pool中的一个 /所有等待线程
static Thread currentTread() 返回当前正在执行线程的引用
void setName()给线程一个名字
String getName()得到线程的名字
long getId() OS分配的一个标识
Company Logowww.themegallery.com
线程的生命周期
new
Running
Runable
Block pool
Dead
start()
OS
sleep()
wait()
notify()
yield()
时间到运行结束wait pool
Company Logowww.themegallery.com
1、不共享代码,也不共享数据两个概念:
当前线程对象,this
当前正在执行的线程对象 Thread.currentThread()
例,ThreadTestA
2、不共享代码,共享数据例,ThreadTestB
Java设计多线程程序的四种模式
Company Logowww.themegallery.com
Java设计多线程程序的四种模式
3、共享代码,也共享数据 --使用 synchronized同步多线程并发访问数据的安全性问题:加锁的机制关键字,Synchronized( 对象实例 )
对象的锁标记例,ThreadTestC
网上银行转账:
If(A>10000){
A=A-10000;
B=B+10000;
}
线程转换了!后果?
Company Logowww.themegallery.com
4、不共享代码,共享数据最经典的多线程例子:生产者 — 消费者仓库生产者消费者例,ThreadTestD.java
注:在 JAVA语言中,程序运行完成的条件:所有线程都运行结束,不一定是主线程运行结束例,建国六十周年 倒计时牌,TimeFrame.java