如何用两个线程打印非重复元素?

时间:2015-04-12 06:30:21

标签: java spring

我想通过两个线程从同一资源打印非重复元素。

这里在下面的代码中,我打印重复的元素

class TestSleepMethod1 extends Thread{  
    public void run(){  
        for(int i=1;i<5;i++){  
            try{Thread.sleep(500);}catch(InterruptedException e){System.out.println(e);}  
            System.out.println(i);  
        }  
    }

    public static void main(String args[]){  
        TestSleepMethod1 t1=new TestSleepMethod1();  
        TestSleepMethod1 t2=new TestSleepMethod1();  

        t1.start();  
        t2.start();  
    }  
}  

输出:

1        1        2        2        3        3        4        4 。我想,如果一个线程打印“1”,其他线程不应再打印“1”而应打印2。如何达到这个条件?  感谢。

4 个答案:

答案 0 :(得分:1)

您可以拥有一个队列(例如:BolockingQueue)并将所有数字添加到其中。然后在添加之后通知线程,该线程应该逐个从队列中获取值。这将帮助您实现您想要的结果。 请参阅http://tutorials.jenkov.com/java-concurrency/blocking-queues.html

答案 1 :(得分:0)

在你的情况下,由于线程处于休眠状态,不太可能发生。

尝试使用不同的睡眠间隔:

class TestSleepMethod1 extends Thread {
    private final long sleepingInterval;

    private TestSleepMethod1(long sleepingInterval) {
        this.sleepingInterval = sleepingInterval;
    }

    public void run(){  
        for(int i=1;i<5;i++){  
            try{Thread.sleep(sleepingInterval);}catch(InterruptedException e){System.out.println(e);}  
            System.out.println(i);  
        }  
    }

    public static void main(String args[]){  
        TestSleepMethod1 t1=new TestSleepMethod1(500);  
        TestSleepMethod1 t2=new TestSleepMethod1(300);  

        t1.start();  
        t2.start();  
    }  
}  

答案 2 :(得分:0)

try 



    static int i =1;
    public void run(){ 
        for(;i<5;){  // you can also use while(i<5)
            try{
                Thread.sleep(500);

            }catch(InterruptedException e){
                System.out.println(e);
            }  
            System.out.println(i++); 
        }  
    }  
    public static void main(String args[]){  
        TestSleepMethod1 t1=new TestSleepMethod1();  
        TestSleepMethod1 t2=new TestSleepMethod1();  

        t1.start();  
        t2.start();  
    }  


output 
1
2
3
4

答案 3 :(得分:0)

您必须使用共享和线程安全的结构来强制执行操作的原子性。

AtomicInteger符合您的需求。 AtomicInteger#incrementAndGet是一个原子操作。因此,对于一个分辨值,只有一个线程会递增该值并返回它:

class TestSleepMethod1 extends Thread{  
    private static final AtomicInteger counter = new AtomicInteger(0);
    public void run(){  
        for(int i=1;i<5;i++){  
            try{Thread.sleep(500);}catch(InterruptedException e){System.out.println(e);}  
            System.out.println(counter.incrementAndGet());  
        }  
    }

    public static void main(String args[]){  
        TestSleepMethod1 t1=new TestSleepMethod1();  
        TestSleepMethod1 t2=new TestSleepMethod1();  

        t1.start();  
        t2.start();  
    }  
}