我正在学习Java但遇到同步问题。我想要从许多Java线程打印数字列表并让每个线程按顺序排列。我在使用synchronized时遇到问题因为我不太了解。可以帮忙理解吗?
我希望输出看到这个,但有时线程的顺序错误。我想要:
1-thread1
2-thread2
3-thread1
4-thread2
5-thread1
6-thread2
...
48-thread2
49-thread1
我的破码:
public class ManyThreadsAdd {
public static int index = 0;
public static void main(String[] args) {
ManyThreadsAdd myClass = new ManyThreadsAdd();
Thread thread1 = new Thread(myClass.new RunnableClass());
Thread thread2 = new Thread(myClass.new RunnableClass());
thread1.start();
thread2.start();
}
class RunnableClass implements Runnable {
public synchronized void run() {
while (index < 49) {
try {
Thread.sleep(100);
System.out.println(index+"-" +Thread.currentThread());
index = index + 1;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
答案 0 :(得分:2)
首先,多线程本质上是异步的,您无法指定执行这些线程的顺序。如果您想要如下所示的输出,请使用循环:
1-thread1
2-thread2
3-thread1
4-thread2
5-thread1
6-thread2
...
48-thread2
49-thread1
其次,通过在synchronized
中添加public synchronized void run()
关键字,您无法获得任何收益。这只意味着在任何时候,一次只有一个线程可以调用该方法。在为每个线程构建新类时,这没有意义。
第三,如果您确实需要在线程之间进行同步,请使用您添加任务的队列,以及您的线程一次读取一个队列。
答案 1 :(得分:2)
这取决于你想做什么。
交替打印顺序的一种简单方法是同步对象,在这种情况下,您可以使用索引或任何其他对象。
public class ManyThreadsAdd {
public static AtomicInteger index = new AtomicInteger(0);
public static void main(String[] args) {
ManyThreadsAdd myClass = new ManyThreadsAdd();
Thread thread1 = new Thread(myClass.new RunnableClass());
Thread thread2 = new Thread(myClass.new RunnableClass());
thread1.start();
thread2.start();
}
class RunnableClass implements Runnable {
public void run(){
synchronized(index){
while(index.get() < 49){
try {
Thread.sleep(100);
System.out.println(index.get()+"-" +Thread.currentThread());
index.incrementAndGet();
index.notify();
index.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}