Java基本同步线程

时间:2014-10-16 14:13:33

标签: java multithreading synchronized

我正在学习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();
                }
            }
        }
    }
}

2 个答案:

答案 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();
                    }
                }
            }
        }
    }
}