多线程
多线程:一个进程中使用多个线程来完成不同的工作,多线程是交替占用内存资源执行的,并非并行执行。
1.进程:进程是程序的一次动态执行过程。
2.线程:线程是进程中执行运算的最小单位,一个进程在其执行过程中可以产生多个线程,而且线程必须在某个进程内执行。
主线程:每个程序至少自动拥有一个线程,即:主线程--------public static void main()主线程入口
创建多线程
定义一个线程类通常有两种方法: 1.继承 java.lang.Thread类 2.实现 java.lang.Runnable接口。
Thread类 的五种状态
1.创建状态 2.就绪状态 3.阻塞状态(Blocked) 4.运行状态(Start) 5.死亡状态(Stop)
Thread类 的常用方法
void run() ; 执行任务操作的方法 void sleep(long millis) ; 使该线程休眠
void start() ; 使该线程开始执行 void join() ; 等待该线程终止
void interrupt() ; 中断线程 void yield() ; 礼让其他线程执行
实现线程同步
关键字:synchronized (注:volatile 实现多线程的可见性)
同步方法: 访问修饰符 synchronized 返回类型 方法名{ }------public synchronized void make(){}
同步代码块: synchronized(this){ //需要同步访问控制的代码 }
实现生产者消费者模式(线程间通信)
常用方法:1. wait() ; 挂起当前线程,释放共享资源锁
2.notify(); 唤起线程 3.notifyAll(); 唤起所有被挂起的线程
参考代码:
public class Test {
volatile static Object str;
} //定义一个线程共享资源。
class Shengchan extends Thread{ //生产者线程类继承Thread类
Object str;
public Shengchan(Object str) { //构造方法
this.str = str;
}
@Override
public void run() { //重写run方法
while (true) {
synchronized (str) { //使用同步代码块访问共享资源
if(Test.str!=null) {
try {
str.wait(); //挂起当前线程
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Test.str=System.currentTimeMillis()+""; // 生成当前时间
System.out.println("生成的时间"+Test.str);
str.notify(); //唤醒线程
}
}
}
}
class Xiaofei extends Thread{ //消费者线程类继承Thread类
Object str;
public Xiaofei(Object str) {
super();
this.str = str;
}
@Override
public void run() {
while (true) {
synchronized (str) {
if(Test.str==null) {
try {
str.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Test.str=null;
System.out.println("消费者消费");
str.notify();
}
}
}
}