Hoàn toàn chính xác. Từ tài liệu :
Không bao giờ hợp pháp để bắt đầu một chủ đề nhiều hơn một lần. Đặc biệt, một luồng có thể không được khởi động lại khi nó đã hoàn tất quá trình thực thi.
Về những gì bạn có thể làm khi tính toán lặp lại, có vẻ như bạn có thể sử dụng phương thức invokeLater của SwingUtilities . Bạn đang thử nghiệm với việc gọi điện run()
trực tiếp, có nghĩa là bạn đã nghĩ đến việc sử dụng một cuộc gọi Runnable
thay vì một cuộc gọi thô Thread
. Hãy thử sử dụng invokeLater
phương pháp trên chỉ cho Runnable
nhiệm vụ và xem liệu cách đó có phù hợp với khuôn mẫu tinh thần của bạn hơn một chút hay không.
Đây là ví dụ từ tài liệu:
Runnable doHelloWorld = new Runnable() {
public void run() {
// Put your UI update computations in here.
// BTW - remember to restrict Swing calls to the AWT Event thread.
System.out.println("Hello World on " + Thread.currentThread());
}
};
SwingUtilities.invokeLater(doHelloWorld);
System.out.println("This might well be displayed before the other message.");
Nếu bạn thay thế nó println
cuộc gọi bằng tính toán của mình, nó có thể chính xác là những gì bạn cần.
CHỈNH SỬA: theo dõi nhận xét, tôi đã không nhận thấy thẻ Android trong bài đăng gốc. Tương đương với invokeLater trong công việc Android là Handler.post(Runnable)
. Từ javadoc của nó:
/**
* Causes the Runnable r to be added to the message queue.
* The runnable will be run on the thread to which this handler is
* attached.
*
* @param r The Runnable that will be executed.
*
* @return Returns true if the Runnable was successfully placed in to the
* message queue. Returns false on failure, usually because the
* looper processing the message queue is exiting.
*/
Vì vậy, trong thế giới Android, bạn có thể sử dụng ví dụ tương tự như trên, thay thế Swingutilities.invokeLater
bằng bài đăng thích hợp thành a Handler
.