Các chủ đề sẽ bắt đầu trong cùng một giây. Tôi hiểu, nếu bạn làm vậy thread1.start()
, sẽ mất vài mili giây trước khi thực hiện tiếp theo thread2.start()
.
Nó thậm chí có thể hoặc không thể?
Các chủ đề sẽ bắt đầu trong cùng một giây. Tôi hiểu, nếu bạn làm vậy thread1.start()
, sẽ mất vài mili giây trước khi thực hiện tiếp theo thread2.start()
.
Nó thậm chí có thể hoặc không thể?
Câu trả lời:
Để bắt đầu các chuỗi chính xác cùng một lúc (ít nhất càng tốt càng tốt), bạn có thể sử dụng CyclicBarrier :
// We want to start just 2 threads at the same time, but let's control that
// timing from the main thread. That's why we have 3 "parties" instead of 2.
final CyclicBarrier gate = new CyclicBarrier(3);
Thread t1 = new Thread(){
public void run(){
gate.await();
//do stuff
}};
Thread t2 = new Thread(){
public void run(){
gate.await();
//do stuff
}};
t1.start();
t2.start();
// At this point, t1 and t2 are blocking on the gate.
// Since we gave "3" as the argument, gate is not opened yet.
// Now if we block on the gate from the main thread, it will open
// and all threads will start to do stuff!
gate.await();
System.out.println("all threads started");
Điều này không nhất thiết phải là một CyclicBarrier
, bạn cũng có thể sử dụng một CountDownLatch
hoặc thậm chí là một ổ khóa.
Điều này vẫn không thể đảm bảo rằng chúng được khởi động chính xác cùng lúc trên các JVM tiêu chuẩn, nhưng bạn có thể đến khá gần. Đến gần vẫn hữu ích khi bạn thực hiện các bài kiểm tra hiệu suất, ví dụ. Ví dụ: nếu bạn đang cố gắng đo lường thông lượng của một cấu trúc dữ liệu với số lượng luồng khác nhau chạm vào nó, bạn muốn sử dụng loại cấu trúc này để có được kết quả chính xác nhất có thể.
Trên các nền tảng khác, bắt đầu chủ đề chính xác có thể là một yêu cầu rất hợp lệ btw.
CreateEvent
. msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspx
Điều này là không thể, ít nhất là trên một máy tính lõi đơn. Nhưng tại sao bạn muốn điều đó? Ngay cả khi bạn có thể bắt đầu hai luồng chính xác trong cùng một giây, chúng sẽ tiến triển khác nhau vì việc lập lịch không nằm trong tầm kiểm soát của bạn.
Chỉnh sửa: (Đáp lại một số ý kiến) Đây là một yêu cầu hoàn toàn hợp lệ để đồng bộ hóa trạng thái hoặc tiến trình của nhiều luồng và CyclicBarrier
là một công cụ tuyệt vời. Tôi đã trả lời câu hỏi liệu có thể bắt đầu nhiều chủ đề cùng một lúc không . CyclicBarrier
sẽ đảm bảo rằng các luồng tiếp tục khi chúng ở chính xác ở trạng thái mong muốn nhưng nó không đảm bảo rằng chúng sẽ bắt đầu hoặc tiếp tục chính xác cùng một lúc, mặc dù nó có thể khá gần. Không có đề cập đến nhu cầu đồng bộ hóa trong câu hỏi.
Bạn có thể sử dụng CountDownLatch cho việc này. Vui lòng tìm dưới đây một mẫu. Mặc dù t1 và t2 được khởi động, các luồng này vẫn tiếp tục đợi cho đến khi luồng chính đếm ngược chốt. Số lần đếm ngược yêu cầu được đề cập trong hàm tạo. Chốt đếm ngược cũng có thể được sử dụng để đợi các luồng kết thúc quá trình thực thi để luồng chính có thể tiến hành thêm (trường hợp ngược lại). Lớp này đã được đưa vào từ Java 1.5.
import java.util.concurrent.CountDownLatch;
public class ThreadExample
{
public static void main(String[] args)
{
CountDownLatch latch = new CountDownLatch(1);
MyThread t1 = new MyThread(latch);
MyThread t2 = new MyThread(latch);
new Thread(t1).start();
new Thread(t2).start();
//Do whatever you want
latch.countDown(); //This will inform all the threads to start
//Continue to do whatever
}
}
class MyThread implements Runnable
{
CountDownLatch latch;
public MyThread(CountDownLatch latch)
{
this.latch = latch;
}
@Override
public void run()
{
try
{
latch.await(); //The thread keeps waiting till it is informed
} catch (InterruptedException e) {
e.printStackTrace();
}
//Do the actual thing
}
}