2012-02-24 31 views
11

Tôi có một chương trình java thực hiện một số phép tính và sau đó tải kết quả lên cơ sở dữ liệu MYSQL (được lưu trữ trong một máy tính khác trong cùng một mạng). Đôi khi tôi phải đối mặt với vấn đề là chương trình tính toán nhanh hơn khi nó tải lên kết quả. Do đó, nó không thể tải lên tất cả các kết quả. Chương trình hiện không được tạo luồng.Làm cho chương trình java ngủ mà không cần luồng

Có cách nào tôi có thể làm cho chương trình ngủ trong vài phần nghìn giây sau khi đã thực hiện các phép tính để quá trình tải lên diễn ra đúng cách. (Giống như trong các ngôn ngữ khác chức năng ngủ hoặc chờ)

Tôi có thể tạo luồng chương trình nhưng sẽ viết lại quá nhiều. Có cách nào dễ hơn không?

Cảm ơn

+4

Tôi tò mò muốn biết làm thế nào một chương trình luồng đơn có thể thực hiện một điều nhanh hơn cái kia và bằng cách nào đó nó không thành công do vấn đề về thời gian. Nếu nó là đơn luồng hơn các hoạt động này là tuần tự. Bạn đang sử dụng một thư viện hay một cái gì đó để tải lên mà làm việc trong một chủ đề khác nhau hoặc một cái gì đó? Nếu nó thực sự đơn luồng thì kịch bản này không thực sự hợp lý. – Robin

+0

@Robin: Tôi nghĩ rằng cách duy nhất có thể là nếu ứng dụng của Ankur đăng ký hoặc thực hiện một số loại quy trình không đồng bộ. Một ứng dụng đơn luồng có thể nằm trong một chuỗi logic duy nhất bị gián đoạn bởi một số sự kiện không đồng bộ. Tuy nhiên, Sleep không phải là ý tưởng đầu tiên để thử và khắc phục vấn đề. –

+0

Tôi đang sử dụng API của bên thứ ba trong chương trình của tôi. Họ có thể tạo ra các chủ đề trong chương trình gây ra async. – Ank

Trả lời

10

Có cách nào tôi có thể làm cho giấc ngủ chương trình cho một vài mili giây sau khi nó đã được thực hiện các tính toán sao cho upload diễn ra đúng cách. (Giống như trong các ngôn ngữ khác chức năng ngủ hoặc chờ)

Thread.sleep(milliseconds) là một phương pháp tĩnh công cộng cũng sẽ hoạt động với các chương trình luồng đơn. Một cái gì đó như sau là một mô hình điển hình:

try { 
    // to sleep 10 seconds 
    Thread.sleep(10000); 
} catch (InterruptedException e) { 
    // recommended because catching InterruptedException clears interrupt flag 
    Thread.currentThread().interrupt(); 
    // you probably want to quit if the thread is interrupted 
    return; 
} 

Không cần phải thực hiện Runnable hoặc thực hiện bất kỳ điều gì khác với các cuộc gọi theo chủ đề. Bạn chỉ có thể gọi nó bất cứ lúc nào để tạm dừng trong một số mã.

+0

Tôi có triển khai Runnable trong lớp học chính của mình không? – Ank

9

Bạn không phải chỉ định lại hoặc bất kỳ thứ gì như vậy. Tất cả những gì bạn cần làm là gọi:

Thread.Sleep(5000); // pause the app for 5 seconds 

Mỗi ứng dụng cũng là một chuỗi, trong trường hợp của bạn còn được gọi là ứng dụng đơn luồng. Bạn có thể sử dụng một API luồng như Sleep w/o bất kỳ mã hoặc tái cấu trúc nào khác.

Lưu ý lớn về mặc dù: Nếu bạn cần sử dụng Thread.Sleep để quản lý luồng điều khiển của bạn thì có thể có điều gì đó sai về mặt kiến ​​trúc. Từ OP của bạn Tôi quan tâm hơn trong những gì bạn mô tả như là một ứng dụng đơn luồng bạn dường như có một hoạt động "vượt trội" khác. Điều này sẽ không thể, trừ khi bạn nhận được sự kiện asynch từ nơi khác.

Thông báo khác: Ngủ mất tham số mili giây thường tùy ý và chỉ có nghĩa là "đợi một chút". Vấn đề là một "thời gian ngắn" có thể được OK ngày hôm nay nhưng ngày mai máy của bạn sẽ được tải trọng lớn hơn và "một chút" sẽ không còn đủ tốt, giấc ngủ của bạn sẽ mất hiệu lực và cùng một lỗi sẽ xuất hiện. Chắc chắn, bạn có thể đặt thời gian cho "một thời gian dài" nhưng sau đó bạn sẽ đợi "một thời gian dài" cho mỗi và mọi giao dịch ... Catch 22.

+0

Ý bạn là gì bởi có lẽ có điều gì đó sai về mặt kiến ​​trúc? Xin lỗi tôi đã không nhận được điều đó !! – Ank

+3

@Ankur: Xem chỉnh sửa gần đây của tôi. Thread.Sleep thường là một hack để sửa chữa một vấn đề thời gian. Nếu mã là của riêng bạn, thì vấn đề về thời gian sẽ là của chính bạn. I E. Ngủ là OK để hack xung quanh các API và dịch vụ của bên thứ ba mà bạn không có quyền kiểm soát, nhưng nếu bạn sở hữu mã, đừng vội sử dụng nó quá nhanh. –

+0

Tôi sở hữu mã nhưng tôi đang sử dụng API MySQL và API của bên thứ ba khác trong đó. Bạn có đề nghị Thread.Sleep()? – Ank

0

Phương pháp tĩnh sleep() trong chế độ tạm dừng java.lang.Thread chuỗi hiện tại - chỉ có thể là chuỗi chính - khi được gọi. Bạn không cần phải làm bất cứ điều gì đặc biệt để sử dụng nó.

3

Sử dụng Thread.sleep():

try 
{ 
    Thread.sleep(1000); // Sleep for one second 
} 
catch (InterruptedException e) 
{ 
    Thread.currentThread().interrupt(); 
} 

này không giới thiệu một mới Thread vào chương trình hoặc yêu cầu bất kỳ Thread máy móc thiết bị liên quan khác.

+0

FYI: Bạn nên gọi Thread.currentThread(). interrupt(); nếu bạn bắt được 'InterruptedException'. Xem: http://stackoverflow.com/questions/4906799/why-invoke-thread-currentthread-interrupt-when-catch-any-interruptexception – Gray

+0

@Gray, cảm ơn. Không biết điều đó. Đã cập nhật câu trả lời. – hmjd

1

Chỉ cần sử dụng: -

try 
{ 
Thread.sleep(<time in ms>); 
} 
catch(InterruptedException ex} 
{ 
} 

Điều này sẽ làm cho thread hiện tại (ví dụ chính thread) ngủ.

+0

Tôi có triển khai Runnable trong lớp chính của mình không? – Ank

+1

Không cần thực hiện Runnable.Đoạn mã trên gọi một phương thức tĩnh để ngủ trong một thời gian, điều này xảy ra trong lớp Thread. Điều này là không thực sự luồng mã của bạn. – Martin

+1

@Ankur Không, Thread.sleep() chỉ là một phương pháp tĩnh thường xuyên, nó không may được đặt tên vì nó không có gì để làm với luồng. –

0

Mỗi ứng dụng Java thực hiện trong một chuỗi trong JVM. Gọi phương thức tĩnh Thread.sleep sẽ làm cho luồng của ứng dụng của bạn (luồng đang chạy) để dừng

0

Chương trình của bạn không phải là Đa đã đọc ... nhưng đang sử dụng một chuỗi. Thread.Sleep sẽ vẫn hoạt động.

0

Bạn có thể sử dụng Thread.sleep(); sau khi tính toán mà không cần phải viết lại toàn bộ chương trình của mình bằng chuỗi!

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