2016-01-20 37 views
6

Tôi muốn biết làm thế nào và khi nào một chủ đề di chuyển qua lại giữa các trạng thái runnable và chạy. Những gì thực sự xảy ra đằng sau hậu trường. Tôi đoán điều này sẽ cần thiết trong trường hợp ThreadPool nhưng tôi không thể hiểu hoàn toàn. tôi hiểu điều này.Làm cách nào để một chuỗi chuyển từ trạng thái chạy sang trạng thái runnable?

+1

Tại sao bạn cần biết? Tôi không biết điều này, nhưng đã sử dụng thành công 'ThreadPool' mà không có kiến ​​thức như vậy. –

+0

Tôi đã tự hỏi ..... nếu thread đang ở trạng thái chạy có nghĩa là phương thức run() thực thi của nó và khi phương thức runnable của nó chạy phương thức start() của nó .... vì vậy tôi đoán việc chuyển từ chạy sang runnable có nghĩa là quay trở lại từ run() để bắt đầu() .... xin vui lòng sửa tôi nếu tôi sai vì tôi là người mới bắt đầu đa luồng –

+0

Tôi thích câu hỏi này, và nếu nó không phải là lừa đảo, tôi bỏ phiếu để giữ nó mở. –

Trả lời

6

nếu chủ đề là trong việc điều hành nhà nước có nghĩa là chạy thực của nó() phương pháp và khi nó trong phương pháp Runnable phương thức start() thực thi của nó .... vì vậy tôi đoán việc chuyển từ chạy sang runnable có nghĩa là nó sẽ quay lại từ run() để bắt đầu()

Trong danh pháp của hầu hết các hệ điều hành, "chạy" có nghĩa là luồng thực sự đang thực hiện các lệnh trên một số CPU, và "runnable" có nghĩa là không có gì ngăn chặn chuỗi từ "đang chạy" ngoại trừ khả năng chạy của CPU.

Một chương trình Java không thể cho biết sự khác biệt giữa hai trạng thái đó. Chủ đề nói rằng Java biết về NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING và TERMINATED.

Một chủ đề MỚI trước khi t.start() được gọi và không bao giờ có thể quay lại MỚI sau đó. WAITING và TIMED_WAITING cả hai có nghĩa là chuỗi đang đợi cuộc gọi notify() trong một số chủ đề khác. BLOCKED có nghĩa là nó đang chờ đợi bất cứ điều gì khác (ví dụ: để nhập một khối synchronized), và TERMINATED có nghĩa là nó đã kết thúc.

0

Yield là một phương pháp tĩnh cho biết chuỗi hiện đang thực thi để tạo cơ hội cho các chuỗi có mức độ ưu tiên bằng nhau trong Thread Pool.

Không đảm bảo rằng Yield sẽ làm cho chuỗi hiện tại đang chạy thành trạng thái có thể chạy ngay lập tức. Hãy nhớ rằng một điểm quan trọng là phương thức lợi nhuận không làm cho luồng đi đến trạng thái Chờ hoặc Bị chặn. Nó chỉ có thể tạo một luồng từ trạng thái chạy đến trạng thái Runnable.

+0

'yield()' hiếm khi được gọi, và nó chắc chắn không phải là cơ chế chính tại nơi làm việc ở đây. Không sử dụng định dạng mã cho văn bản không phải là mã. – EJP

+0

@Anand ..... cảm ơn lời giải thích.Chỉ cần thêm một nghi ngờ nữa .... chúng tôi sẽ sử dụng năng suất thủ công trong mã của chúng tôi ... đúng không? JVM tự lo liệu điều này như thế nào? –

+0

* "Không có gì đảm bảo rằng Lợi nhuận sẽ làm cho luồng hiện đang chạy thành trạng thái runnable ngay lập tức." * ... Thật vậy. Nó hoàn toàn có thể chấp nhận được đối với một JVM hoàn toàn không có gì cả khi Thread.yield() được gọi. Một chương trình phụ thuộc vào hành vi của Thread.yield() cho tính chính xác của nó là một chương trình không di động ở mức tốt nhất, và một chương trình thiếu sót nghiêm trọng lúc tồi tệ nhất. – scottb

0

Extract từ Cẩm Nang Dành Programmer của Java SCJP Chứng nhận: Chủ đề:

static void năng suất() Phương pháp này làm cho thread hiện hành để tạm thời tạm dừng thực hiện của nó và, do đó, cho phép các chủ đề khác để thực thi. Việc JVM quyết định xem liệu và khi nào thì quá trình chuyển đổi này sẽ diễn ra.

Ngủ trống tĩnh (dài millisec) ném InterruptedException Chủ đề hiện tại sẽ ngủ trong khoảng thời gian được chỉ định trước khi nó đủ điều kiện để chạy lại.

khoảng trống chính thức tham gia() throws InterruptedException khoảng trống chính thức tham gia (millisec dài) throws InterruptedException Một cuộc gọi đến bất kỳ của hai phương pháp này gọi trên một sợi sẽ chờ đợi và không trở lại cho đến khi một trong hai sợi chỉ đã hoàn thành hoặc nó được timed out sau thời gian quy định, tương ứng.

vô hiệu ngắt() Phương thức này sẽ ngắt chuỗi mà trên đó nó được gọi. Trong trạng thái Đang chờ thông báo, Ngủ hoặc Bị chặn-cho-tham gia hoàn thành, luồng sẽ nhận được một InterruptedException.

Dưới đây Ví dụ minh họa quá trình chuyển đổi giữa các trạng thái chuỗi. Một luồng tại (1) ngủ một chút tại (2) và sau đó thực hiện một số tính toán trong một vòng lặp tại (3), sau đó chủ đề kết thúc. Phương thức main() theo dõi luồng trong vòng lặp tại (4), in trạng thái luồng được trả về bởi phương thức getState(). Đầu ra cho thấy luồng đi qua trạng thái RUNNABLE khi phương thức run() bắt đầu thực thi và sau đó chuyển đến trạng thái TIMED_WAITING để ngủ. Khi thức dậy, nó tính toán vòng lặp trong trạng thái RUNNABLE và chuyển đến trạng thái TERMINATED khi phương thức run() kết thúc.

Ví dụ: chủ đề Hoa

public class ThreadStates { 

    private static Thread t1 = new Thread("T1") { // (1) 
    public void run() { 
     try { 
     sleep(2);         // (2) 
     for(int i = 10000; i > 0; i--);   // (3) 
     } catch (InterruptedException ie){ 
     ie.printStackTrace(); 
     } 
    } 
    }; 

    public static void main(String[] args) { 
    t1.start(); 
    while(true) {         // (4) 
     Thread.State state = t1.getState(); 
     System.out.println(state); 
     if (state == Thread.State.TERMINATED) break; 
    } 
    } 
} 

có thể sản lượng từ chương trình:

RUNNABLE 
TIMED_WAITING 
... 
TIMED_WAITING 
RUNNABLE 
... 
RUNNABLE 
TERMINATED 
Các vấn đề liên quan