2012-01-27 25 views
15

Tôi đang cố gắng để hiểu mã here, đặc biệt là tầng lớp vô danhRunnable mới() nhưng không có chuỗi mới?

private Runnable mUpdateTimeTask = new Runnable() { 
public void run() { 
    final long start = mStartTime; 
    long millis = SystemClock.uptimeMillis() - start; 
    int seconds = (int) (millis/1000); 
    int minutes = seconds/60; 
    seconds  = seconds % 60; 

    if (seconds < 10) { 
     mTimeLabel.setText("" + minutes + ":0" + seconds); 
    } else { 
     mTimeLabel.setText("" + minutes + ":" + seconds);    
    } 

    mHandler.postAtTime(this, 
      start + (((minutes * 60) + seconds + 1) * 1000)); 
    } 
}; 

Bài báo nói

Các Handler chạy mã cập nhật như một phần của chủ đề chính của bạn, tránh những phí của chủ đề thứ hai ..

Không nên tạo lớp Runnable mới tạo chuỗi mới thứ hai? Mục đích của lớp Runnable ở đây ngoài việc có thể vượt qua một lớp Runnable để postAtTime là gì?

Cảm ơn

+2

No. Runnables không phải là 'Chủ đề'. http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html –

Trả lời

41

Runnable thường được sử dụng để cung cấp các mã mà a thread nên chạy, nhưng Runnable bản thân không có gì để làm với chủ đề. Nó chỉ là một đối tượng với phương thức run().

Trong Android, lớp Handler có thể được sử dụng để yêu cầu khung chạy một số mã sau này trên cùng một chuỗi, thay vì trên một chuỗi khác. Runnable được sử dụng để cung cấp mã sẽ chạy sau này.

+0

"Runnable chính nó không có gì để làm với chủ đề" đây là khái niệm WRONG! Vui lòng đọc tài liệu. Giao diện Runnable nên được thực hiện bởi bất kỳ lớp nào mà các cá thể của nó được dự định thực hiện bởi một luồng. Nó cũng gây nhầm lẫn khi Runnable được thông qua, nhưng những thứ xảy ra trong cùng một chủ đề. Vui lòng đọc về "nguyên tắc ít ngạc nhiên nhất". – glaz666

+13

@ glaz666, tài liệu 'Runnable' nói về chủ đề vì chúng là * sử dụng phổ biến nhất của 'Runnable', nhưng giao diện phù hợp với bất kỳ loại gọi lại nào. Tôi nghĩ rằng việc sử dụng 'Runnable' của Android Handler' là hoàn toàn hợp lý - nó tốt hơn việc định nghĩa một giao diện Android cụ thể mới giống với' Runnable' nhưng với một tên khác. – Wyzard

+0

Ví dụ về "Runnable mới()" mà không "mở rộng Chủ đề" hoặc "triển khai Runnable": http://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing. java –

6

Runnable chỉ là một giao diện, cung cấp phương thức chạy. Chủ đề là triển khai và sử dụng Runnable để gọi phương thức run().

21

Nếu bạn muốn tạo ra một mới Thread ... bạn có thể làm một cái gì đó như thế này ...

Thread t = new Thread(new Runnable() { public void run() { 
    // your code goes here... 
}}); 
+3

Không phải những gì OP hỏi. – alfoks

16

Giao diện Runnable là một cách khác mà bạn có thể thực hiện đa luồng khác hơn là mở rộng Thread lớp do thực tế là Java cho phép bạn mở rộng chỉ một lớp.

Bạn tuy nhiên có thể, sử dụng new Thread(Runnable runnable) constructor, một cái gì đó như thế này:

private Thread thread = new Thread(new Runnable() { 
public void run() { 
    final long start = mStartTime; 
    long millis = SystemClock.uptimeMillis() - start; 
    int seconds = (int) (millis/1000); 
    int minutes = seconds/60; 
    seconds  = seconds % 60; 

    if (seconds < 10) { 
     mTimeLabel.setText("" + minutes + ":0" + seconds); 
    } else { 
     mTimeLabel.setText("" + minutes + ":" + seconds);    
    } 

    mHandler.postAtTime(this, 
      start + (((minutes * 60) + seconds + 1) * 1000)); 
    } 
}); 

thread.start(); 
+0

do đó ví dụ này tạo ra một chuỗi mới hay không, bởi vì bạn đã sử dụng Thread nhưng không được gọi là start() .. – sgarg

+1

@shishirgarg: Ví dụ này tạo ra một đối tượng Thread mới. Để thực hiện nó, chỉ cần gọi phương thức 'start()' như sau: 'thread.start()'. Điều đó nên gọi nội bộ phương thức 'run()' (lưu ý, bạn không bao giờ nên gọi phương thức 'run()') mà khởi động luồng đó. – npinti

10

Bạn có thể tạo một sợi chỉ như thế này:

Thread thread = new Thread(new Runnable() { 
        public void run() { 

         } 
        }); 
       thread.start(); 

Ngoài ra, bạn có thể sử dụng Runnable, Asyntask, Timer , TimerTaks và AlarmManager để kích hoạt Threads.

+0

bạn có thể ghi đè lên phương thức run() của Thread. Lợi ích của việc tạo Runnable là gì? –

0

Cách tốt nhất và dễ dàng chỉ là vượt qua đối số và tạo ra ví dụ và gọi chủ đề phương pháp

Gọi chủ đề sử dụng tạo ra một đối tượng thread và gửi một đối tượng lớp Runnable với tham số hoặc mà không cần tham số và bắt đầu phương pháp của đối tượng thread.

Trong điều kiện của tôi, tôi đang gửi tham số và tôi sẽ sử dụng trong phương thức chạy.

chủ đề mới (new FCMThreadController ("2", null, "3", "1")).khởi đầu(); .

HOẶC

new Thread (mới FCMThreadController()) start();

public class FCMThreadController implements Runnable { 
private String type; 
private List<UserDeviceModel> devices; 
private String message; 
private String id; 


    public FCMThreadController(String type, List<UserDeviceModel> devices, String message, String id) { 

     this.type = type; 
     this.devices = devices; 
     this.message = message; 
     this.id = id; 
    } 



    public FCMThreadController() { 

    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

    } 



} 
0

Chủ đề giống như một số nhánh. Đa nhánh có nghĩa là khi có ít nhất hai nhánh. Nếu các nhánh bị giảm, thì mức tối thiểu vẫn là một. Điều này là mặc dù giống như các chi nhánh bị loại bỏ, nhưng nói chung chúng tôi không xem xét nó chi nhánh.

Tương tự khi có ít nhất hai luồng, chúng tôi gọi đó là chương trình đa luồng. Nếu các chủ đề được giảm, mức tối thiểu vẫn là một. Hello chương trình là một chương trình đơn luồng, nhưng không ai cần phải biết đa luồng để viết hoặc chạy nó.

Nói một cách đơn giản khi chương trình không được cho là có chủ đề, nó có nghĩa là chương trình không phải là một chương trình đa luồng, nhiều hơn theo nghĩa đích thực nó là một chương trình luồng đơn, trong đó bạn có thể đặt mã của bạn như thể nó là đa luồng.

Dưới một mã vô dụng được đưa ra, nhưng nó sẽ đủ để loại bỏ một số nhầm lẫn của bạn về Runnable. Nó sẽ in "Hello World".

class NamedRunnable implements Runnable { 

    public void run() { // The run method prints a message to standard output. 
     System.out.println("Hello World"); 
    } 

    public static void main(String[]arg){ 
     NamedRunnable namedRunnable = new NamedRunnable(); 
     namedRunnable.run(); 
    } 
} 
0

Không nên tạo lớp Runnable mới tạo chuỗi mới thứ hai?

Số mới Runnable không tạo thứ hai Thread.

Mục đích của lớp Runnable ở đây ngoài việc có thể vượt qua lớp Runnable để postAtTime là gì?

Runnable được đăng lên Handler. Tác vụ này chạy trong chuỗi, được liên kết với Handler.

Nếu Handler được kết hợp với Giao diện người dùng, Runnable chạy trong Giao diện người dùng.

Nếu Handler gắn liền với HandlerThread, chạy Runnable khác trong HandlerThread


Để rõ ràng sư Handler MainThread của bạn (UI Chủ đề), hãy viết dưới mã.

Handler mHandler = new Handler(Looper.getMainLooper(); 

Nếu bạn viết như sau, nó sử dụng HandlerThread Looper.

HandlerThread handlerThread = new HandlerThread("HandlerThread"); 
handlerThread.start(); 
Handler requestHandler = new Handler(handlerThread.getLooper()); 

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