2012-05-31 35 views
8

Vì vậy, tôi đang cố gắng làm việc với các chủ đề cho một trò chơi mà tôi đang thực hiện. Tôi là rất mới đối tượng nên tôi có thể không hiểu chính xác. Câu hỏi của tôi là phương thức currentThread() hoạt động như thế nào trong lớp Thread của java API. API nói "Trả về một tham chiếu đến đối tượng chuỗi đang thực thi hiện tại.", Nhưng theo như tôi hiểu nhiều luồng chạy cùng một lúc. Làm thế nào là nó có thể trả về chỉ một chuỗi thực hiện?Phương pháp hiện tại chủ đề java

+0

bạn nên đọc một số hướng dẫn về luồng. – Sajmon

+2

Tôi nghĩ rằng họ nên đặt tên nó là getSelfThread() hoặc một cái gì đó như thế, bởi vì có thể có nhiều hơn một hiện đang thực hiện thread với cp đa lõi. – goat

Trả lời

6

Mã gọi currentThread sẽ được thực hiện trong một trong các chủ đề, không phải trong tất cả các chuỗi, để có thể nhận được chuỗi đó cụ thể.

+0

Cảm ơn bạn đã làm cho nó rõ ràng hơn nhiều. – user1427380

4

Khi lệnh trong mã của bạn được thực thi, nó được thực hiện trong một chuỗi cụ thể. Đây là luồng được trả về bởi phương thức đó.

Rõ ràng, nếu một phương pháp cụ thể được thực hiện bởi nhiều luồng, mỗi lần thực hiện có thể trả về một giá trị khác nhau cho Thread.currentThread().

Bạn có thể thử ví dụ ngắn này để có ý tưởng tốt hơn về những gì đang diễn ra và cụ thể là 2 luồng thực thi song song. Bạn sẽ thấy rằng t1 sẽ chạy một vài vòng sau đó t2 sẽ làm như vậy và trở lại T1 vv (bạn có thể cần phải tăng số vòng từ 5 đến một số cao hơn tùy thuộc vào máy tính của bạn):

public class TestThread { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       for (int i = 0; i < 5; i++) { 
        System.out.println(Thread.currentThread()); 
       } 
      } 
     }; 

     Thread t1 = new Thread(r, "t1"); 
     Thread t2 = new Thread(r, "t2"); 
     t1.start(); 
     t2.start(); 
    } 
} 
+1

Tại sao bạn cần in ra chuỗi hiện tại trong một vòng lặp? Một khi đủ, tôi sẽ nghĩ. – Jeffrey

+0

Tôi thích 2 câu đầu tiên của bạn ... nhưng phần còn lại của bài đăng, đặc biệt là mã, có vẻ mơ hồ, đủ để gây nhầm lẫn. – goat

+0

@ Jeffrey ý tưởng là để hiển thị một số interleaving nơi một sợi có thể chạy vòng lặp hai lần sau đó một khác đi hoạt động vv – assylias

0

"Chuỗi hiện đang thực hiện" có nghĩa là trình lên lịch hệ thống đã dành một chút thời gian cho luồng này để thực thi mã của nó.

-1

Nhiều luồng không chạy cùng lúc và có quá trình chuyển đổi chuỗi giữa nhiều luồng. Bộ vi xử lý có thể thực hiện một tác vụ tại một thời điểm để một luồng được thực thi một lúc. Vì vậy, chúng tôi nhận được tham chiếu của thread hiện đang chạy.

+0

Máy đa lõi thực sự chạy nhiều luồng cùng một lúc. Tôi có một chương trình đa luồng, đa luồng (với các chủ đề tương tác cao) hoạt động trên một máy tính lõi đơn, sau đó chuyển nó sang một máy có 4 lõi. Đó là một nền giáo dục thực sự. – RalphChapin

+0

"Nhiều luồng không được chạy cùng một lúc ..." – jdv

4

Giả sử bạn có danh sách các hướng dẫn được in trên một mảnh giấy. Một người đọc hướng dẫn và thực hiện chúng. Các hướng dẫn là một chương trình. Người đó là một sợi chỉ. Bạn có thể tạo nhiều bản sao của tờ giấy và truyền cho nhiều người. Nếu hướng dẫn nói một cái gì đó như, "tát bản thân," mình là bất kỳ ai đang đọc hướng dẫn đó từ bài báo đó. Tương tự, Thread.currentThread() đề cập đến chuỗi đang thực hiện cuộc gọi đó đến currentThread().

0

Khi viết một ứng dụng đơn luồng, bạn có thể suy luận trên chương trình của bạn giống như một loạt các hướng dẫn, mỗi thực hiện sau khi trước đó đã kết thúc (đây là một xấp xỉ thô, nhưng khái niệm compilator và bộ xử lý cố gắng mô phỏng đó và làm việc như nếu điều này thực sự là những gì đã xảy ra).

Khi bạn sử dụng nhiều chuỗi, mỗi chuỗi có một chuỗi hướng dẫn riêng. Một chủ đề mới khi được tạo được thông qua một điểm vào (một phương thức), và sẽ tiếp tục thực thi từ chúng. Mỗi luồng độc lập với luồng khác trong thực thi của chúng (nó sẽ chỉ thực hiện một lệnh sau lệnh kia), mặc dù chúng chia sẻ bộ nhớ và do đó tác dụng phụ từ một luồng có thể ảnh hưởng đến một luồng khác. Vì vậy, đối với một số mã được thực hiện, nó phải được thực hiện trong bối cảnh của một luồng (có một hệ điều hành được tạo ra khi ứng dụng của bạn bắt đầu, bắt đầu thực hiện tại phương thức Main). Khi hàm currentThread được gọi, nó là một trong những ngữ cảnh đó.

Thời gian chạy java khi tạo chuỗi sẽ lưu tham chiếu đến đối tượng Thread trong ngữ cảnh chuỗi và currentThread sẽ chỉ tra cứu ở đó và trả về chuỗi hiện tại.

0

Tại bất kỳ thời điểm cụ thể nào, chỉ một chuỗi sẽ được thực hiện (trực tiếp), vì vậy, Thread.currentThread() trả về chi tiết của Chuỗi đang thực hiện. ví dụ: Thread_name, priority, method_name.

Các vấn đề liên quan