2012-03-22 19 views
5

Khi các chủ đề khác nhau truy cập một phương thức tĩnh, các đối tượng được khai báo trong phương thức đó cục bộ hoặc được chia sẻ giữa các luồng trong java?Khi các chủ đề khác nhau truy cập một phương thức tĩnh, là các đối tượng được khai báo trong phương thức đó cục bộ hoặc được chia sẻ trong java

Ngoài ra, có an toàn khi gọi thread.interrupt() trên một chuỗi đang hoạt động không?

+3

Đó là hai câu hỏi riêng biệt và nên được hỏi trong hai bài đăng riêng biệt. – Jeffrey

+0

gọi thread.interrupt trên các chủ đề làm io theo phương thức tĩnh –

+1

vẫn còn hai câu hỏi riêng biệt. – Jeffrey

Trả lời

8

Đối tượng được khai báo bên trong phương thức static không được chia sẻ giữa các chuỗi. Các đối tượng được xác định bên ngoài phương thức là static được chia sẻ.

Vì vậy:

private static Object thisIsShared; 

public static void myMethod() { 
    Object thisIsNotShared = new Object(); 
} 

Nếu bạn đang đi để được gọi interrupt() về chủ đề làm I/O, bạn nên xem xét sử dụng các lớp học mà thực hiện the InterruptableChannel interface.

1

Các biến được khai báo trong phương thức tĩnh KHÔNG được chia sẻ giữa các luồng. Khi một phương thức tĩnh không sửa đổi bất kỳ đối tượng tĩnh hoặc chia sẻ nào khác, nó là luồng an toàn - có nghĩa là nhiều luồng có thể gọi phương thức và không có gì xấu xảy ra.

Looking here, rất nhiều thứ có thể xảy ra khi làm gián đoạn chuỗi. Nhưng nó không có vẻ như có một thread gọi một phương pháp tĩnh là một trong số họ. Tôi có thể sai.

+0

'tĩnh' không liên quan gì đến nó. – EJP

2

Liên quan đến ngắt() ->

Nó phụ thuộc vào cách bạn sẽ xử lý các ngắt trên chuỗi IO. Mặc dù tên của nó, ngắt() không có gì hơn là truyền một thông báo ngắt đến chuỗi đã cho. Nó không có nghĩa là ngừng hoạt động càng nhanh càng tốt. Chuỗi nhận sẽ thấy thông báo này và tăng InterruptedException. Làm thế nào nó sau đó sẽ phản ứng với tình hình là hoàn toàn trong quyền lực của nó. Nó có thể chọn để bỏ qua nó, khởi động lại chính nó, tắt, bất cứ điều gì.

Ngắt nói chung được sử dụng khi bạn cần nói một luồng khác mà cơ bản đã thay đổi và ngữ cảnh hiện tại có thể không còn hợp lệ hoặc mong muốn hoặc có thể hoặc bất cứ điều gì bạn cần.

1

câu trả lời đúng là: tĩnh và không tĩnh, không quan trọng.

biến cục bộ luôn là cục bộ cho lời gọi đó của phương thức, bất kể phương thức đó có tĩnh hay không. chúng được phân bổ trên stack và popped off stack (và unreferenceable) sau khi thoát khỏi phương thức.

như đối với câu hỏi thứ hai của bạn, đọc các tài liệu,

http://developer.android.com/reference/java/lang/Thread.html

nếu bạn đang sử dụng non-blocking IO, sau đó có gọi interrupt() có thể có ý nghĩa tùy thuộc vào những gì bạn mong đợi (một lần nữa , đọc tài liệu). nếu bạn đang làm chặn IO, gọi interrupt() sẽ không có hiệu lực.

1

Gọi an toàn là thread.interrupt() trên một chuỗi đang thực hiện I/O miễn là I/O đang được thực hiện trên interruptable channel.

Nếu chủ đề này bị chặn trong hoạt động I/O khi kênh bị gián đoạn thì kênh sẽ bị đóng, trạng thái ngắt của luồng sẽ được đặt và chuỗi sẽ nhận được ClosedByInterruptException.

Theo java.lang.Thread

1

Khi đề khác nhau truy cập vào một phương pháp tĩnh, được đối tượng khai báo trong phương pháp mà địa phương hoặc chia sẻ giữa các chủ đề trong java?

Đối tượng được khai báo theo bất kỳ phương pháp nào là cục bộ cho phương pháp. Nó không tạo ra bất kỳ sự khác biệt nào cho dù phương thức là tĩnh hay bất cứ thứ gì.

1

Các biến được khai báo trong phương thức tĩnh hoặc không tĩnh không được chia sẻ giữa các luồng khác nhau.

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