同步线程

时间:2014-05-05 12:49:20

标签: java multithreading synchronization

所以我有一个代码:

public void runThreads(int number)
{
    List<Thread> threadList = new ArrayList<Thread>();
    for (int i = 0; i < number; i++)
    {
        Thread t = new MyThread(getRandomPerson(),i);
        threadList.add(t);
    }

    for (Thread x : threadList)
    {
        x.start();
    }
}

所以我将线程添加到我的线程列表中然后启动这个线程。 这是MyThread类:

public class MyThread extends Thread
{
    Person person;
    int number;

    public MyThread(Person person, int number)
    {
        this.person = person;
        this.number = number;
    }
    @Override
    public void run()
    {
        try
        {
            synchronized (this)
            {
                Thread.sleep(1000);
                System.out.println(number + "\t" + person.getSurname());
                Thread.sleep(1000);
                System.out.println(number + "\t" + person.toString());
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

我想创建一个创建线程的程序,将它们添加到列表中,调用它们但每个线程应该等到上一个结束它的任务。 所以输出应该是:

1 Surname
/** Waitning second */
1 person.toString()
/** Waiting second*/
And then the second thread start invoking:
2 Surname
....

如何使用synchronized实现此目的?我尝试了不同的方法来使用synchronized,但它失败了。

3 个答案:

答案 0 :(得分:1)

您需要一个公共锁定 - 此时您正在同步this,这对于每个线程都是不同的。尝试类似:

private static final Object lock = new Object();

并改为同步静态(因此共享)变量。

答案 1 :(得分:1)

public class MyThread extends Thread
{

    private static Object lock = new Object();

...
            synchronized (lock)
            {
                Thread.sleep(1000);
                System.out.println(number + "\t" + person.getSurname());
                Thread.sleep(1000);
                System.out.println(number + "\t" + person.toString());
            }
...

这样你就会得到同一个人的姓氏和toString()。你不会对人强制执行严格的命令,7人仍然可以在人1之前。

答案 2 :(得分:1)

如果必须使用线程,并且必须具有执行顺序,那么您可以在t.join()之后立即执行t.start() - 这将确保以下流程:

- Main Thread
      - loop
      - start child thread
      - wait for child thread to finish
      - continue loop
- Exit Main thread

但是,正如之前所指出的那样,你不需要线程就可以做到这一点,因为你可以看到这种方法绝对没有收获(除了大学),而且事实上它是有害的。

特别感谢@assylias。

相关问题