---------------------- android培训、java培训、期待与您交流! ---------------------
1. JDK5.0实现生产者消费者模型:
public class ProducterConsumer {
public static void main(String[] args) {
Goods goods=new Goods();
Producter pro=new Producter(goods);
Consumer con=new Consumer(goods);
new Thread(pro).start();
new Thread(con).start();
new Thread(pro).start();
new Thread(con).start();
}
}
class Goods{
String name;
int count=0;
Lock lock=new ReentrantLock();
Condition conSetter=lock.newCondition();
Condition conGetter=lock.newCondition();
boolean flag=false;
public void getName() {
lock.lock();
try{
while(!flag)
try {
conGetter.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"~~~消费者~~~~"+name+" "+count);
flag=false;
conSetter.signalAll();
}finally{
lock.unlock();
}
}
public void setName(String name) {
lock.lock();
try{
while(flag)
try {
conSetter.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.name=name;
count++;
System.out.println(Thread.currentThread().getName()+"~~~~~~生产者~~~~~~~~~"+name+" "+count);
flag=true;
conGetter.signalAll();
}finally{
lock.unlock();
}
}
}
class Consumer implements Runnable{
Goods goods=new Goods();
public Consumer(Goods goods) {
this.goods=goods;
}
@Override
public void run() {
while(true)
goods.getName();
}
}
class Producter implements Runnable{
Goods goods=new Goods();
public Producter(Goods goods) {
this.goods=goods;
}
@Override
public void run() {
while(true)
goods.setName("商品");
}
}
10.停止线程:stop方法已经过时,不能用它停止线程。由于多线运行代码通常是循环结构因此,要停止线程时,可以用标记控制线程,使run方法结束。
特殊情况:
当线程处于了冻结状态,即等待状态时,就不会读取到标记。那么线程就不会结束。此时,可以用Thread类提供该方法 interrupt()方法强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。
class StopThread implements Runnable
{
private boolean flag =true;
public void run()
{
while(flag)
{
try {
Thread.sleep(1111111);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName()+"....run");
}
System.out.println(Thread.currentThread().getName()+"....over");
}
public void changeFlag()
{
flag = false;
}
}
public class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true)
{
if(num++ == 60)
{
st.changeFlag();
//若没有此段代码,线程要等到睡眠时间结束后才会结束
t1.interrupt();
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
System.out.println("over");
}
}
11.当在主线程中调用d.join()方法时(d为线程),d线程将会抢夺主线程的cup,此时将执行d线程,主线程处于阻塞状态,直到d线程执行完为止。
---------------------- android培训、java培训、期待与您交流! ----------------------