我的程式只列印出一個獲勝者并且仍然允許其他執行緒在列印他們的時間時完成比賽時遇到問題。當我取出 System.out.println 行時,它把一切都搞砸了,我不知道它是如何以及為什么可能的。
我正在使用 Runnable 和 lock 陳述句,但仍然遇到問題。
執行緒事物
package com.company;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadThings implements Runnable {
Lock lock = new ReentrantLock();
private String ThreadName;
static boolean winner;
int position = 0;
public ThreadThings(String ThreadName) {
this.ThreadName = ThreadName;
}
//Start of a thread
@Override
public synchronized void run() {
lock.lock();
long startTime = System.currentTimeMillis();
for (int i = 1; i <= 100; i ) {
System.out.println(ThreadName " Meters " i);
this.position = i;
//position ;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
if ((position == 100) && (winner == false)) {
System.out.println(ThreadName " wins");
winner = true;
System.out.println("Congrats " ThreadName " you are the winner");
}
/** if ((position == 10) && (winner == true)) {
System.out.println("Good Try " ThreadName);
}
**/
}
long stopTime = System.currentTimeMillis();
long raceTime = stopTime - startTime;
System.out.println(ThreadName " Time is " raceTime " Minutes");
// else {System.out.println("Thanks for running"); }
lock.unlock();
}
}
主要的
package com.company;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
ThreadThings t1 = new ThreadThings("Abby");
ThreadThings t2 = new ThreadThings("Brandon");
ThreadThings t3 = new ThreadThings("Casey");
ThreadThings t4 = new ThreadThings("David");
ThreadThings t5 = new ThreadThings("Eddie");
ThreadThings t6 = new ThreadThings("Frank");
ThreadThings t7 = new ThreadThings("Gabby");
ThreadThings t8 = new ThreadThings("Hannah");
ThreadThings t9 = new ThreadThings("Indie");
ThreadThings t10 = new ThreadThings("Jasmine");
Thread Runner1 = new Thread(t1);
Thread Runner2 = new Thread(t2);
Thread Runner3 = new Thread(t3);
Thread Runner4 = new Thread(t4);
Thread Runner5 = new Thread(t5);
Thread Runner6 = new Thread(t6);
Thread Runner7 = new Thread(t7);
Thread Runner8 = new Thread(t8);
Thread Runner9 = new Thread(t9);
Thread Runner10 = new Thread(t10);
lock.lock();
Runner1.start();
Runner2.start();
Runner3.start();
Runner4.start();
Runner5.start();
Runner6.start();
Runner7.start();
Runner8.start();
Runner9.start();
Runner10.start();
lock.unlock();
}
}
uj5u.com熱心網友回復:
你鎖了 3 件不同的東西,而且每把鎖都完全沒用。
你缺少的東西是鎖不是神奇的小精靈塵埃,它只是隨機地讓事情起作用。它們用于鏈接結構——如果兩個不同的執行緒都試圖鎖定同一個鎖物件,就會發生一些事情(其中一個會等待)。如果你做任何其他事情,它是沒有用的。
無用的鎖 1 = 鎖在main
您創建一個鎖,然后將其鎖定。此鎖不與任何其他執行緒共享,因此什么也不做。
無用的鎖 2 = 鎖在ThreadThings.run()
同樣,一個不與其他任何東西共享的鎖。每個執行緒都有自己的鎖,并鎖定它。這無濟于事。
無用的鎖 3 =synchronized
synchronized,在實體方法上,是將整個方法體鎖定在 上的語法糖this。鑒于您正在制作 10 個新ThreadThings物件,這些都是鎖,沒有其他東西在鎖定,因此,它們什么也不做。
修復
制作一個鎖物件并在任何地方使用它。請注意,您在這里使用的基本方法(即在啟動執行緒時鎖定并在完成時解鎖)意味著整個練習將以不同的方式無用:您將有 10 個執行緒,但是 10 個中有 9 個會等待。換句話說,它只是一個沒有任何用處的歌曲和舞蹈例程——你不妨按順序執行這 10 個任務,因為如果你修復了它,那正是你的代碼會做的事情。
鎖是如何作業的
找到需要同步的一件事并使用鎖來保護該部分,僅此而已。例如,我非常懷疑您是否想要Thread.sleep() 在鎖定的塊內,因為鎖沒有脫離。您的執行緒現在等待 10 毫秒,其他執行緒也將等待 10 毫秒,因為他們根本無法在沒有獲得鎖的情況下繼續,而他們不能,因為您的睡眠執行緒擁有它。
如果您愿意,您可以在一個執行緒中鎖定和解鎖幾次。這似乎是您正在尋找的東西。
修復:
- 要么使用鎖,要么使用
synchronized. 不是都。 - 制作一把鎖 - 或者
synchronized在一個物件上,或者在您的物件中創建一把鎖main并將其傳遞給 10 個 ThreadThings 物件,以便他們可以鎖定它。 - 不要只在頂部
run()鎖定并在末尾解鎖 - 那么您的執行緒只是無用的練習。可能多次鎖定和解鎖(即在睡眠前解鎖,在繼續前重新鎖定)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488411.html
