ShineYoung

导航

 
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.concurrent.FutureTask;

class Answer implements Callable<String>
{
    private boolean flag = true;
    @Override
    public synchronized String call() throws Exception {
        if(flag == true) {
            Thread.sleep(100);
            flag = false;
            return Thread.currentThread().getName() + "抢答成功";
        }
        else {
            return Thread.currentThread().getName() + "抢答失败";
        }
    }
}







public class ThreadCompete {
    public static void main(String[] args) {
        Answer answer = new Answer();
        FutureTask<String> task1 = new FutureTask<>(answer);
        FutureTask<String> task2 = new FutureTask<>(answer);
        FutureTask<String> task3 = new FutureTask<>(answer);
        new Thread(task1).start();
        new Thread(task2).start();
        new Thread(task3).start();
        try {
            System.out.println(task1.get());
            System.out.println(task2.get());
            System.out.println(task3.get());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

 

class Resource{
    private int num = 0;
    private boolean flag = true;
    
    public synchronized void add() {
        
        while(this.flag == false) {
            try {
                super.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        this.num++;
        System.out.println("加法操作-" + Thread.currentThread().getName() + this.num);
    
        this.flag = false;
        super.notifyAll();
    }
    
    public synchronized void sub() {
        while(this.flag == true) {
            try {
                super.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(80);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        this.num--;
        System.out.println("减法操作-" + Thread.currentThread().getName() + this.num);
        
        this.flag = true;
        super.notifyAll();
    }
}

class Jia implements Runnable{
    private Resource resource;
    
    public Jia(Resource resource) {
        this.resource = resource;
    }
    
    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            resource.add();
        }
        
    }
}

class Jian implements Runnable{
    private Resource resource;
    
    public Jian(Resource resource) {
        this.resource = resource;
    }
    
    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            resource.sub();;
        }
        
    }
}



public class ThreadJiaJian {
    public static void main(String[] args) {
        Resource resource = new Resource();
        Jian jian = new Jian(resource);
        Jia jia = new Jia(resource);
        new Thread(jian,"减法线程A").start();
        new Thread(jian,"减法线程B").start();
        new Thread(jia,"加法线程X").start();
        new Thread(jia,"加法线程Y").start();
        
    }
}
posted on 2019-03-02 19:56  ShineYoung  阅读(223)  评论(0编辑  收藏  举报