brand new start

常用链接

统计

最新评论

java 多线程

生产消费例子:
用synchronized:
class Resource{
    
private String name;
    
private int count = 0;
    
private boolean flag = true;
    
public synchronized void set(String name){
        
while(!flag){
            
try {
                wait();
            } 
catch (InterruptedException e) {
            
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
if(flag){
            
this.name = name;
            System.out.println(Thread.currentThread().getName()
+"   生产了    "+name+""+(++count));
            
        }
        flag 
= false;
        notifyAll();
    }
    
public synchronized void get(){
        
while(flag){
            
try {
                wait();
            } 
catch (InterruptedException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
if(!flag){
            System.out.println(Thread.currentThread().getName()
+"   消费了    "+name+""+count);
            
        }
        flag 
= true;
        notifyAll();
    }
}

class Producer implements Runnable{
    
private Resource r;
    Producer(Resource r){
        
this.r = r;
    }
    
public void run(){
        
while(true){
            r.set(
"Tom");
        }
    }
    
}

class Consumer implements Runnable{
    
private Resource r;
    Consumer(Resource r){
        
this.r = r;
    }
    
public void run(){
        
while(true){
            r.get();
        }
    }
    
}

public class TradeDemo {
    
public static void main(String[] args){
        Resource res 
= new Resource();
        Producer p 
= new Producer(res);
        Consumer c 
= new Consumer(res);
        Thread t1 
= new Thread(p);
        Thread t2 
= new Thread(p);
        Thread t3 
= new Thread(c);
        Thread t4 
= new Thread(c);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
用Lock:
import java.util.concurrent.locks.*;

import org.junit.Test;

class Resources {
    
private String name;
    
private int count = 0;
    
private boolean flag = true;
    
private Lock lock = new ReentrantLock();
    
private Condition condition_pro = lock.newCondition();
    
private Condition condition_con = lock.newCondition();

    
public void set(String name) {
        lock.lock();
        
try {
            
while (!flag) {
                condition_pro.await();
            }
            
if (flag) {
                
this.name = name;
                System.out.println(Thread.currentThread().getName()
                        
+ "   生产了    " + name + "" + (++count));

            }
            flag 
= false;
            condition_con.signal();
        } 
catch (InterruptedException e) {
            System.out.println(
"生产exception");
        } 
finally {
            lock.unlock();
        }
    }

    
public void get() {
        lock.lock();
        
try {
            
while (flag) {
                condition_con.await();
            }
            
if (!flag) {
                System.out.println(Thread.currentThread().getName()
                        
+ "   消费了    " + name + "" + count);

            }
            flag 
= true;
            condition_pro.signal();
        } 
catch (InterruptedException e) {
            System.out.println(
"消费exception");
        } 
finally {
            lock.unlock();
        }
    }
}

class Producers implements Runnable {
    
private Resources r;

    Producers(Resources r) {
        
this.r = r;
    }

    
public void run() {
        
while (true) {
            r.set(
"Tom");
        }
    }

}

class Consumers implements Runnable {
    
private Resources r;

    Consumers(Resources r) {
        
this.r = r;
    }
    @Test
    
public void run() {
        
while (true) {
            r.get();
        }
    }

}

public class TradeDemo2 {
    
public static void main(String[] args) {
        Resources res 
= new Resources();
        Producers p 
= new Producers(res);
        Consumers c 
= new Consumers(res);
        Thread t1 
= new Thread(p);
        Thread t2 
= new Thread(p);
        Thread t3 
= new Thread(c);
        Thread t4 
= new Thread(c);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
Dead lock:
public class DeadLockThread implements Runnable{
    
private int tickets = 100;
    
private boolean flag;
    DeadLockThread(
boolean flag){
        
this.flag = flag;
    }
    
public void run(){
        
while(tickets>0){
            
if(flag){
                
synchronized(MyLock.locka){
                    System.out.println(
"if locka");
                    
synchronized(MyLock.lockb){
                        System.out.println(Thread.currentThread().getName()
+"..true.."+"if lockb  "+tickets--);
                    }
                }
            }
            
else{
                
synchronized(MyLock.lockb){
                    System.out.println(
"else lockb");
                    
synchronized(MyLock.locka){
                        System.out.println(Thread.currentThread().getName()
+"..false.."+"else lockb  "+tickets--);
                    }
                }
            }
        }
    }
    
}

class MyLock{
    
static Object locka = new Object();
    
static Object lockb = new Object();
}

posted on 2012-06-14 17:12 Nemo_blinker 阅读(1017) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问