2015-04-06 19 views
5

Có một chương trình bên ngoài tạo tệp XML nhưng có thể mất một lúc để tạo. Tôi cần chương trình Java của mình để chờ cho đến khi tệp tồn tại trước khi tiếp tục.Làm cách nào để phương thức của tôi chờ tệp tồn tại trước khi tiếp tục

Tôi đã được đọc lên một chút về khối đồng bộ, và tôi đọc mà tôi có thể làm điều gì đó như thế này:

synchronized(this) { 
    while (!file.exists) { this.wait(); } 
} 

Thành thật mà nói tôi không thực sự biết nhiều về nhiệm vụ đồng bộ vì vậy tôi Tôi tự hỏi liệu tôi có đi đúng hướng hay không.

+0

Hết thời gian chờ (thời gian chờ lâu); vì vậy mà sau cùng một thời gian thread nên thức dậy. – Prashant

+5

No. Đây hoàn toàn không phải là cách thức hoạt động này, hãy quên đi 'đồng bộ'. Bạn có thể 1) chờ cho chương trình kết thúc, hoặc viết một cái gì đó từ chương trình đến stdout khi chương trình ghi tập tin; hoặc 2) sử dụng ['WatchService'] (http://stackoverflow.com/q/16251273/2071828) để theo dõi các thay đổi thư mục. –

+1

Thứ nhất, 'synchronised' liên quan đến các chương trình đa luồng. Thứ hai, chương trình bên ngoài đang chạy độc lập với chương trình java của bạn, hoặc chương trình java của bạn khởi chạy chương trình bên ngoài này? –

Trả lời

0

Vì vậy, những gì tôi đã làm là một vòng lặp while kiểm tra xem tệp có tồn tại không. Nếu không, tôi đặt Thread để ngủ trong một giây. Dường như nó hoạt động chính xác. Cảm ơn bạn vì sự giúp đỡ.

+0

Tôi khuyên bạn nên xem xét các phương pháp tiếp cận hướng sự kiện, chẳng hạn như 'WatchService', thay vì cách tiếp cận vòng lặp và thăm dò ý kiến. Nó sẽ phục vụ bạn tốt để di chuyển ra khỏi phức tạp và chủ yếu là cau mày khi thói quen. –

+0

Ya, tôi cũng không thích phương pháp bỏ phiếu. Tôi sẽ xem WatchService. – namxal

-3

Theo ý kiến ​​của tôi, bạn nên có thông báo gì đó về chuỗi. Sau đây là ví dụ của tôi.

public class Test { 
File file; 
public Test(File file){ 
    this.file = file; 
} 

public void findFile(){ 
    synchronized(this){ 
     while(!file.exists()){ 
      try { 
       System.out.println("before wait:"); 
       this.wait(); 
       System.out.println("after wait:"); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public void createFile(){ 
    synchronized(this){ 
     try { 
      System.out.println("before create a new file:"); 
      file.createNewFile(); 
      System.out.println("after create a new file:"); 
      this.notify(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public static void main(String[] args){ 
    Test t = new Test(new File("/Users/yehuizhang/Desktop/uttp.txt")); 
    Thread t1 = new Thread(new FindFile(t)); 
    Thread t2 = new Thread(new CreateFile(t)); 
    t1.start(); 
    t2.start(); 
} 
} 

class FindFile implements Runnable{ 
Test t; 
public FindFile(Test t){ 
    this.t = t; 
} 

@Override 
public void run(){ 
    t.findFile(); 
} 
} 

class CreateFile implements Runnable{ 
Test t; 

public CreateFile(Test t){ 
    this.t = t; 
} 

@Override 
public void run(){ 
    t.createFile(); 
} 
} 
+0

Điều này sẽ không hoạt động đối với các chương trình bên ngoài. –

+0

@ColonelThirtyTwo Ba mươi Hai không hoạt động tốt. Kết quả là 'trước khi chờ: trước khi tạo tệp mới: sau khi tạo tệp mới: sau khi chờ: ' – uttp

+1

Chờ đợi cái gì? 'createFile' nằm trong một chương trình bên ngoài và không thể thông báo chuỗi' findFile'. –

3

Một cách điển hình để giải quyết vấn đề này là để người viết XML của bạn tạo tệp XML và khi nó được thực hiện, nó sẽ tạo tệp thứ hai cho biết công việc đã hoàn thành.

Chương trình java của bạn nên lắng nghe sự tồn tại của tệp .done chứ không phải tệp XML.

Sẽ không hoạt động nếu bạn không có bất kỳ quyền kiểm soát nào đối với ứng dụng viết XML.

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