创建三个线程和主线程。将每个线程作为同步任务执行。退出每个线程时显示信息。
我可以通过上面的练习运行两个线程,但很难有三个线程。这是我的计划。
package Thread;
import java.util.concurrent.atomic.AtomicBoolean;
公共课测试{
static AtomicBoolean lock = new AtomicBoolean(false);
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("New Thread: "
+ Thread.currentThread().toString());
for (int i = 5; i > 0; i--) {
synchronized (lock) {
if (lock.get()) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("First: " + i);
if (i == 1) {
System.out.println("Second exiting.");
}
lock.set(true);
lock.notify();
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("New Thread: "
+ Thread.currentThread().toString());
for (int i = 5; i > 0; i--) {
synchronized (lock) {
if (!lock.get()) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Second: " + i);
if (i == 1) {
System.out.println("Second exiting.");
}
lock.set(false);
lock.notify();
}
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main thread exiting.");
}
}
结果:
您能否给我一些方法或提示来解决此问题。谢谢你的回复!
答案 0 :(得分:1)
目前还不清楚你想要三个线程做什么。你有两个线程 一个等待bool是假的,一个等待它是真的,对吧? 有三个线程,您需要等待三个状态。你也需要 非常小心地设置它以便状态转换完全发生 以正确的顺序和一定的时间。
要么尝试编写该程序,并告诉我们出了什么问题,或者如果你想要的话 设计有助于告诉我们更多关于你想要实现的目标 结束。
建议您是否有需要解决的真正多线程问题 是看queues之类的东西。它们是非常好的高级抽象 这使得使用线程更好。
更有可能的是,你有一些需要解决的人工任务 你需要谈谈你所遇到的限制。
答案 1 :(得分:0)
阅读有关Thread
中Java
同步的教程here。
答案 2 :(得分:0)
公共类同步扩展了线程{
public void run() {
synchronized (this) {
for (int i = 5; i > 0; i--) {
System.out.print("Thread Name :" + Thread.currentThread().getName() + i+"\n");
}
}
}
}
课程演示{
public static void main(String args[]) {
sync obj1 =new sync();
sync obj2 =new sync();
sync obj3 =new sync();
obj1.setName("First");
obj2.setName("Second");
obj3.setName("Third");
obj1.start();
obj2.start();
obj3.start();
}
}
O/p:
主题名称:First5 主题名称:First4 主题名称:First3 线程名称:First2 线程名称:First1 线程名称:Second5 线程名称:Second4 线程名称:Second3 线程名称:Second2 线程名称:Second1 主题名称:Third5 主题名称:Third4 主题名称:Third3 主题名称:Third2 主题名称:Third1
希望这有助于:)