2012-03-11 48 views
10

Tôi đang cố gắng tạo nhiều luồng, số chủ đề phụ thuộc vào đầu vào từ dòng lệnh. Tôi biết mở rộng Thread không phải là thực hành tốt nhất của OO trừ khi bạn đang tạo một phiên bản đặc biệt của Thread, nhưng giả thuyết là đoạn mã này tạo ra kết quả mong muốn?Java - Tạo nhiều luồng với vòng lặp

class MyThread extends Thread { 

    public MyThread (String s) { 
    super(s); 
    } 

    public void run() { 
    System.out.println("Run: "+ getName()); 
    } 
} 


class TestThread { 
    public static void main (String arg[]) { 

    Scanner input = new Scanner(System.in); 
    System.out.println("Please input the number of Threads you want to create: "); 
    int n = input.nextInt(); 
    System.out.println("You selected " + n + " Threads"); 

    for (int x=0; x<n; x++) 
    { 
     MyThread temp= new MyThread("Thread #" + x); 
     temp.start(); 
     System.out.println("Started Thread:" + x); 
    } 
} 
} 
+0

Bạn nói, "mở rộng Chủ đề không phải là thói quen OO tốt nhất trừ khi bạn đang thực hiện một phiên bản đặc biệt của Chủ đề." Tuy nhiên, ví dụ của bạn làm cho một phiên bản chuyên biệt của chủ đề; trông ổn với tôi. – apollodude217

+1

nếu bạn muốn kiểm tra, bạn có thể chạy chương trình của bạn trong chế độ gỡ lỗi và xem có bao nhiêu chủ đề được creeated .. – Rockin

Trả lời

6

Vâng, nó được tạo ra và bắt đầu n đề, tất cả kết thúc ngay sau khi in Run: và tên của họ.

1

Một điều quan trọng java JVM có thể tạo 20000 luồng tại một thời điểm. Tạo 255 chủ đề trong java

class MyThread1 extends Thread { 
    int k; 
    public MyThread1(int i) { 
      k = i; 
    } 

    @Override 
    public void run() { 
     //Your Code 
     System.out.println("Thread no. "+k); 

    } 
} 
class MainClass { 

    public static void main(String arg[]) throws UnknownHostException { 
     Refresh() ; 
    } 

    public static void Refresh(){ 

     //create 255 Thread using for loop 
     for (int x = 0; x < 256; x++) { 
      // Create Thread class 
      MyThread1 temp = new MyThread1(x); 
       temp.start(); 
      try { 
       temp.join(10); 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
1

Bạn có lựa chọn tốt hơn với mã ExecutorService

mẫu:

import java.util.concurrent.*; 

public class ExecutorTest{ 
    public static void main(String args[]){ 

     int numberOfTasks = Integer.parseInt(args[0]); 
     ExecutorService executor= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 
     try{ 
      for (int i=0; i < numberOfTasks; i++){ 
       executor.execute(new MyRunnable(i));     
      } 
     }catch(Exception err){ 
      err.printStackTrace(); 
     } 
     executor.shutdown(); // once you are done with ExecutorService 
    } 
} 
class MyRunnable implements Runnable{ 
    int id; 
    public MyRunnable(int i){ 
     this.id = i; 
    } 
    public void run(){ 
     try{ 
      System.out.println("Runnable started id:"+id); 
      System.out.println("Run: "+ Thread.currentThread().getName()); 
      System.out.println("Runnable ended id:"+id); 
     }catch(Exception err){ 
      err.printStackTrace(); 
     } 
    } 
} 

Cách sử dụng:

java ExecutorTest 2 

Runnable started id:0 
Run: pool-1-thread-1 
Runnable ended id:0 
Runnable started id:1 
Run: pool-1-thread-2 
Runnable ended id:1 

bài viết liên quan: (Ưu điểm của việc sử dụng ExecutorService như một sự thay thế cho đồng bằng Thread)

ExecutorService vs Casual Thread Spawner

How to properly use Java Executor?

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