我想通过两个线程从同一资源打印非重复元素。
这里在下面的代码中,我打印重复的元素
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。如何达到这个条件? 感谢。
答案 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();
}
}