来这边实习块快个月了,今晚突然想把前面学到的东西做个总结,其实也不算是总结,只能算是个人学习的一点体会,先把今天学习的线程说一下吧。
1,首先得知道线程的几个状态:
线程的创建,就绪,运行,阻塞,消亡 五种状态。
ps:线程的创建一般有2种方式,1是继承Thread类 ;2是实现Runnable接口。
2,线程的同步(Synchronized)
比如,在一个火车售票系统中,同时多个窗口售票,临界资源的使用和释放。
3,线程间的通信
就如操作系统中的生产者和消费者的关系,要先放了,才能拿走,也是一个临界资源的占用和释放问题。
下面就拿实际的程序来看,相信能有更深刻的体会的:
package Thread;
public class Threadproductandconsumer {
public static void main(String[] args) {
// TODO Auto-generated method stub
produceandconsumeThread pct=new produceandconsumeThread();
ProduceThread pt=new ProduceThread(pct);
ConsumeThread ct=new ConsumeThread(pct);
Thread p=new Thread(pt);
Thread c=new Thread(ct);
p.start();
c.start();
}
}
class produceandconsumeThread {
String[] s =new String[2];
String s1 = "重庆";
String s2 = "===>西南大学";
String s3 = "北京";
String s4 = "===>北京大学";
int flag=0;
public void sleep() {
int r = (int) (Math.random() * 500);
try {
Thread.sleep(r);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized void produce() {
for (int i = 0; i < 10; i++) {
while (flag == 1) {
try {
wait();// 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (i % 2 == 0) {
s[0] = s1;
sleep();
s[1] = s2;
flag = 1;
notify();// 唤醒在此对象监视器上等待的单个线程。
} else {
s[0] = s3;
sleep();
s[1] = s4;
flag = 1;
notify();
}
}
}
public synchronized void consume() {
sleep();
for (int k = 0; k < 10; k++) {
while (flag == 0) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.print(s[0]);
sleep();
System.out.print(s[1]);
System.out.print("\n");
flag = 0;
notify();
}
}
}
class ProduceThread implements Runnable {
private produceandconsumeThread pc1;
public ProduceThread(produceandconsumeThread pc) {
this.pc1 = pc;
}
public void run() {
// TODO Auto-generated method stub
pc1.produce();
}
}
class ConsumeThread implements Runnable {
private produceandconsumeThread pc2;
public ConsumeThread(produceandconsumeThread pc) {
this.pc2 = pc;
}
public void run() {
// TODO Auto-generated method stub
pc2.consume();
}
}
阅读(737) | 评论(2) | 转发(0) |