2012-08-30 11 views
8

Tôi đã nghiên cứu rất nhiều hướng dẫn về các chủ đề trong java nhưng tôi không thể tìm thấy câu trả lời của mình.Chạy hai tác vụ độc lập đồng thời bằng cách sử dụng các chủ đề

Câu hỏi của tôi là: cách chạy hai chuỗi độc lập đồng thời?

Trường hợp của tôi là: Tôi có hai nhiệm vụ;

  1. lưu một số dữ liệu vào cơ sở dữ liệu
  2. gửi thông báo đẩy trên thiết bị di động.

Vì hai tác vụ này độc lập nên tôi muốn thực hiện chúng đồng thời.

Tôi đã thử sử dụng một nhóm luồng với hai luồng nhưng vấn đề là các tác vụ cơ sở dữ liệu hoàn tất nhanh chóng nhưng phải mất một thời gian để gửi thông báo đẩy.

Do đó khi một tác vụ được hoàn tất trong khi tác vụ kia vẫn đang chờ xử lý, nó sẽ ném một ngoại lệ.

Cũng không có vấn đề gì trong mã của tôi vì nó chạy tốt mà không sử dụng chuỗi.

Cảm ơn trước

+2

* nó ném ngoại lệ * có thể hữu ích khi đăng ngoại lệ tại đây – Robin

+1

Các tác vụ có liên quan không? Tức là bạn muốn gửi thông báo SAU KHI dữ liệu đã được lưu? Hay bạn chỉ muốn xếp hàng một loạt các nhiệm vụ ngẫu nhiên vào hàng đợi ??? – MadProgrammer

+0

@MadProgrammer cảm ơn bạn đã trả lời nhanh chóng.cơ sở dữ liệu cả hai nhiệm vụ độc lập với nhau. do đó, nó không quan trọng nếu dữ liệu được lưu đầu tiên hoặc thông báo đẩy được gửi đầu tiên –

Trả lời

25
new Thread(new Runnable() { 
    public void run() { 
     System.out.println("Look ma, no hands"); 
    } 
}).start(); 

new Thread(new Runnable() { 
    public void run() { 
     System.out.println("Look at me, look at me..."); 
    } 
}).start(); 

Làm việc tốt ...

Tôi muốn sử dụng một ExecutorService cá nhân.

CẬP NHẬT với ExecutorService dụ

Vì vậy, tôi đã viết ví dụ này thực sự nhanh chóng ...

Về cơ bản nó sử dụng một ExecutorService để chạy một vài nhiệm vụ đơn giản. Khi đứng, cả hai nhiệm vụ sẽ chạy song song với nhau (cùng một lúc)

public static void main(String[] args) throws InterruptedException { 
    ExecutorService service = Executors.newFixedThreadPool(2); 
    service.submit(new PathScanner()); 
    service.submit(new Counter()); 

    service.shutdown(); 
    service.awaitTermination(1, TimeUnit.DAYS); 

    System.exit(0); 
} 

public static class PathScanner implements Callable<Object> { 

    @Override 
    public Object call() throws Exception { 
     scan(new File("C:/"), 0); 
     return null; 
    } 

    protected void scan(File path, int deepth) { 
     if (deepth < 15) { 
      System.out.println("Scanning " + path + " at a deepth of " + deepth); 

      File[] files = path.listFiles(); 
      for (File file : files) { 
       if (file.isDirectory()) { 
        scan(file, ++deepth); 
       } 
      } 
     } 
    } 
} 

public static class Counter implements Callable<Object> { 

    @Override 
    public Object call() throws Exception { 
     for (int index = 0; index < 1000; index++) { 
      Thread.sleep(1); 
      System.out.println(index); 
     } 
     return null; 
    } 
} 

Run nó ...

Bây giờ thay đổi ExecutorService service = Executors.newFixedThreadPool(2);-ExecutorService service = Executors.newFixedThreadPool(1); và chạy nó một lần nữa. Bạn có thấy sự khác biệt không?

Đây là cách để kiểm soát số lượng các chuỗi đồng thời mà người thực thi có thể sử dụng trong khi xử lý hàng đợi của nó.

Tạo thêm một số tác vụ và thêm chúng vào hàng đợi và xem những gì bạn nhận được.

+2

+1 cho ví dụ nhanh chóng .. – John

+0

cảm ơn bạn đã phản hồi nhanh và ví dụ của bạn! câu trả lời được chấp nhận! :-) –

+0

Trong ví dụ đầu tiên của bạn, làm cách nào để in ID của chuỗi? –

0

Tôi đã có một trường hợp sử dụng để tìm kiếm tệp trong nhiều thư mục bằng cách sử dụng đa luồng. Là một đầu vào, tôi chỉ có đường dẫn thư mục gốc và có thể có bất kỳ số lượng thư mục con nào. Giả định - Tệp sẽ luôn có sẵn chỉ trong một trong các thư mục con.

import java.io.File; 
import java.io.FileFilter; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class SearchFile implements Runnable { 

    private String dirPath = null; 

    public SearchFile() { 

    } 

    public SearchFile(String dirPath) { 
     this.dirPath = dirPath; 
    } 

    public static void main(String[] args) { 
     long startTime = System.currentTimeMillis(); 
     File dir = new File("D://"); 
     checkRootDirectory(dir); 
     long endTime = System.currentTimeMillis(); 
     System.out.println("Time taken: "+(endTime - startTime) + "ms"); 
    } 

    private static void checkRootDirectory(File root) { 
     File[] list = root.listFiles(new FileFilter() { 

      @Override 
      public boolean accept(File pathname) { 
       return pathname.isDirectory() && !pathname.isHidden(); 
      } 
     }); 

     ExecutorService service = Executors.newFixedThreadPool(list.length); 
     for (File directories : list) { 
      String dirPath = directories.getAbsolutePath(); 
      Thread thread = new Thread(new SearchFile(dirPath)); 
      service.execute(thread); 
     } 
     service.shutdown(); 
     while(!service.isTerminated()) { 

     } 
    } 

    @Override 
    public void run() { 
     checkEachDirectory(new File(dirPath), "Temp.txt"); 
    } 

    private void checkEachDirectory(File root, String fileName) { 
     File[] list = root.listFiles(); 
     if (null != list) { 
      for (File dir : list) { 
       if (dir.isDirectory()) { 
        checkEachDirectory(dir, fileName); 
       } else if (fileName.equalsIgnoreCase(dir.getName())) { 
        System.out.println(
          "Thread name: " + Thread.currentThread().getName() + " Founded @" + dir.getAbsolutePath()); 
       } 
      } 
     } 
    } 
}