cuốn sách gpt4 ai đã làm

Có thể bắt đầu một luồng bằng cách gọi run() trong phương thức run() không?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 04:46:44 34 4
mua khóa gpt4 Nike

Tôi biết rằng không nên gọi phương thức chạy để bắt đầu một luồng thực thi mới, nhưng ý tôi là bài viết nàyHọ gọi một phương thức chạy khác runnable.run(); , điều này dường như ngụ ý rằng nó bắt đầu một chuỗi mới hoặc hoàn toàn không bắt đầutạo ra/strong> Tạo luồng, nó chỉ tạo một luồng mới và chạy tất cả các luồng có thể chạy được trong cùng một luồng, tức là theo từng tác vụ?

Đây là mã được đề cập trong bài viết.

 lớp công khai ThreadPool {

riêng tư BlockingQueue taskQueue = null;
Danh sách riêng tư chủ đề = new ArrayList();
boolean riêng tư isStopped = false;

public ThreadPool(int noOfThreads, int maxNoOfTasks){
taskQueue = BlockingQueue mới(maxNoOfTasks);

for(int i=0; i
thread.add(new PoolThread(taskQueue));
}
for(Chủ đề PoolThread : chủ đề){
thread.start();
}
}

thực thi void được đồng bộ hóa công khai (Tác vụ có thể chạy được) ném Ngoại lệ {
if(this.isStopped) ném
new IllegalStateException("ThreadPool đã dừng");

this.taskQueue.enqueue(task);
}

void stop được đồng bộ hóa công khai(){
this.isStopped = true;
for(Chủ đề PoolThread : chủ đề){
thread.doStop();
}
}

}

lớp công khai PoolThread mở rộng Chủ đề {

riêng tư BlockingQueue taskQueue = null;
boolean riêng tư isStopped = false;

public PoolThread(Hàng đợi BlockingQueue){
taskQueue = hàng đợi;
}

công khai void run(){
while(!isStopped()){
try{
Runnable runnable = (Runnable) taskQueue.dequeue();
runnable.run();
} bắt(Ngoại lệ e){
// ghi nhật ký hoặc báo cáo ngoại lệ,
// nhưng vẫn giữ cho thread trong nhóm tồn tại.
}
}
}

void doStop() được đồng bộ hóa công khai
isStopped = đúng;
this.interrupt(); //ngắt luồng nhóm ra khỏi lệnh gọi dequeue().
}

boolean được đồng bộ hóa công khai isStopped(){
return isStopped;
}
}

câu hỏi:

  1. Tại sao thread.start(); Nó có được gọi trong hàm tạo không?

  2. nếu như thread.start(); Làm cách nào để truy vấn nhiệm vụ của tôi trước khi được gọi this.taskQueue.enqueue(task);

  3. Để hiểu tất cả điều này, hãy đăng một lớp trình điều khiển cho ví dụ nàymaxNoOfTasks=10noOfThreads=3. Đầu ra giống nhau, mọi trợ giúp đều được đánh giá cao.

  4. Runnable.run() trong phương thức chạy có bắt đầu một luồng mới không?

Cảm ơn

câu trả lời hay nhất

tôi đang đề cập đến bài viết này nơi họ đã gọi runnable.run(); bên trong một phương thức chạy khác và có vẻ như nó ngụ ý rằng nó bắt đầu một luồng mới.

Nhìn vào đoạn mã, tôi không thấy hàm ý gì cả.

Đây không phải là bắt đầu một chủ đề mới. Nó đang chạy cái tiếp theo trong hàng đợi trên luồng nhóm hiện tại Có thể chạy được.

Tôi biết rằng không nên gọi phương thức chạy đó để bắt đầu thực thi luồng mới...

KHÔNGkhông nên,不能. :-) gọi chạy Chỉ cần gọi nó trên chủ đề hiện tại chạy, giống như bất kỳ cuộc gọi phương thức nào khác.

  1. Tại sao thread.start(); được gọi là hàm tạo bên trong?

Bắt đầu chỉ sử dụng PoolThread mới (taskQueue) Đã tạo chủ đề.

  1. Làm cách nào để tôi thực hiện nhiệm vụ của mình nếu thread.start(); được gọi ngay cả trước khi gọi this.taskQueue.enqueue(task);

Bạn chuyển nó chothi hành. Nó được thêm vào hàng đợi việc cần làm (hàng đợi nhiệm vụ). ThreadPool 创建的 PoolChủ đề Người ta sẽ nhận được nó vào lần tiếp theo nó miễn phí.

  1. Để hiểu tất cả những điều này, vui lòng đăng một lớp trình điều khiển cho ví dụ này với maxNoOfTasks=10 và noOfThreads=3. và đầu ra tương tự sẽ được đánh giá cao.

Tôi không biết ý của bạn về hạng lái xe là gì, nhưng tôi nghĩ chỉ cần trả lời câu hỏi là đủ.

  1. Làm Runnable.run() phương pháp chạy bên trong bắt đầu một chủ đề mới?

没有。


Để hiểu điều này làm gì, hãy tưởng tượng bạn tạo một ThreadPool. ThreadPool Hàm tạo ngay lập tức tạo và bắt đầu năm PoolChủ đề chủ đề. Những chủ đề này liên tục kiểm tra hàng đợi nhiệm vụ để xem có việc gì phải làm không và nếu có thì họ sẽ làm.

Tất nhiên, ban đầu,hàng đợi nhiệm vụ luôn trống nên luồng đang bận chờ, liên tục quay để kiểm tra hàng đợi nhiệm vụ nội dung trong. (Điều này không lý tưởng, nó tiêu tốn CPU mà không có lý do. Sẽ tốt hơn nếu tạm dừng luồng khi không có gì để làm, nhưng điều này đang bắt đầu ngày càng xa rời vấn đề thực tế.)

Sau đó, tại một thời điểm nào đó, bạn gọithi hành và vượt qua trong một nhiệm vụ. Điều này sẽ thêm nó vào hàng đợi nhiệm vụ. Lần tiếp theo một trong năm chủ đề kiểm tra hàng đợi nhiệm vụ nội dung trong , nó sẽ tìm vàchủ đề này(không phải chủ đề mới).

Về java - Có thể bắt đầu một chuỗi bằng cách gọi run() trong phương thức run() không? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/50582818/

34 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress