多线程在java开发中是非常重要的一环,因为它充分利用了CPU的特性,尤其现在多核CPU的发展。很多时候能大大的提高性能,像tomcat服务器就利用了多线程,这才有并发问题。
线程共有五个状态:新生、就绪、运行、阻塞、死亡
其中需要注意一点的是:同步块中如果线程sleep了,是不会释放锁的,这个也是我们下面要谈的线程之间通信利用wait和Notify 的不同之处。
线程之间通信,首先要有共享资源,不然通信无法达成,这个共享资源是线程之间通信的桥梁。
下面贴出我自己写的生产者,消费者问题,仅供大家参考
共享资源 Basket
package com.tx;
public class Basket {
private boolean isEmpty=true;
/**
* @return the isEmpty
*/
public synchronized boolean isEmpty() {
return isEmpty;
}
/**
* @param isEmpty the isEmpty to set
*/
public synchronized void setEmpty(boolean isEmpty) {
this.isEmpty = isEmpty;
}
}
生产者线程 ProduceThread
package com.tx;
/**
* 生产者线程
* @author 24572
*
*/
public class ProduceThread extends Thread {
private Basket basket;
public ProduceThread(Basket basket) {
super();
this.basket = basket;
}
public void run(){
while(true){
synchronized (basket) {
if(!basket.isEmpty()){
try {
Thread.sleep(1000);
basket.wait();
} catch (Exception e) {
e.printStackTrace();
}
}else{
System.out.println("生产苹果");
basket.setEmpty(false);
basket.notify();
}
}
}
}
}
消费者线程 BuyerThread
package com.tx;
/**
* 消费者线程
* @author 24572
*
*/
public class BuyerThread extends Thread {
private Basket basket;
public BuyerThread(Basket basket) {
super();
this.basket = basket;
}
public void run(){
while (true) {
synchronized (basket) {
if(basket.isEmpty()){
try {
Thread.sleep(1000);
basket.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println("消费苹果");
basket.setEmpty(true);
basket.notify();
}
}
}
}
}
测试类 Test
package com.tx;
public class Test {
public static void main(String[] args) {
Basket basket=new Basket();
ProduceThread pt=new ProduceThread(basket);
BuyerThread bt=new BuyerThread(basket);
pt.start();
bt.start();
}
}
测试结果
生产苹果
消费苹果
生产苹果
消费苹果
生产苹果
消费苹果
生产苹果
就是上面这个简单的例子,就算是入门了,当然了,多线程之间的问题特别的复杂,也特别的绕,学好真的不容易,但是一定要啃下这块硬骨头,因为它是我们java程序员的基本功.