所以我有一个代码:
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
,但它失败了。
答案 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。