欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Java基礎-創(chuàng )建Java程序中的線(xiàn)程池

Java基礎-創(chuàng )建Java程序中的線(xiàn)程池

 
 

線(xiàn)程是Java的一大特性,它可以是給定的指令序列、給定的方法中定義的變量或者一些共享數據(類(lèi)一級的變量)。在Java中每個(gè)線(xiàn)程有自己的堆棧和程序計數器(PC),其中堆棧是用來(lái)跟蹤線(xiàn)程的上下文(上下文是當線(xiàn)程執行到某處時(shí),當前的局部變量的值),而程序計數器則用來(lái)跟蹤當前線(xiàn)程正在執行的指令。

在通常情況下,一個(gè)線(xiàn)程不能訪(fǎng)問(wèn)另外一個(gè)線(xiàn)程的堆棧變量,而且這個(gè)線(xiàn)程必須處于如下?tīng)顟B(tài)之一:

1.排隊狀態(tài)(Ready),在用戶(hù)創(chuàng )建了一個(gè)線(xiàn)程以后,這個(gè)線(xiàn)程不會(huì )立即運行。當線(xiàn)程中的方法start()被調用時(shí),這個(gè)線(xiàn)程就會(huì )進(jìn)行排隊狀態(tài),等待調度程序將它轉入運行狀態(tài)(Running)。當一個(gè)進(jìn)程被執行后它也可以進(jìn)行排隊狀態(tài)。如果調度程序允許的話(huà),通過(guò)調用方法yield()就可以將進(jìn)程放入排隊狀態(tài)。

2.運行狀態(tài)(Running),當調度程序將CPU的運行時(shí)間分配給一個(gè)線(xiàn)程,這個(gè)線(xiàn)程就進(jìn)入了運行狀態(tài)開(kāi)始運行。

3.等待狀態(tài)(Waiting),很多原因都可以導致線(xiàn)程處于等待狀態(tài),例如線(xiàn)程執行過(guò)程中被暫停,或者是等待I/O請求的完成而進(jìn)入等待狀態(tài)。

在Java中不同的線(xiàn)程具有不同的優(yōu)先級,高優(yōu)先級的線(xiàn)程可以安排在低優(yōu)先級線(xiàn)程之前完成。如果多個(gè)線(xiàn)程具有相同的優(yōu)先級,Java會(huì )在不同的線(xiàn)程之間切換運行。一個(gè)應用程序可以通過(guò)使用線(xiàn)程中的方法setPriority()來(lái)設置線(xiàn)程的優(yōu)先級,使用方法getPriority()來(lái)獲得一個(gè)線(xiàn)程的優(yōu)先級。

線(xiàn)程的生命周期

一個(gè)線(xiàn)程的的生命周期可以分成兩階段:生存(Alive)周期和死亡(Dead)周期,其中生存周期又包括運行狀態(tài)(Running)和等待狀態(tài)(Waiting)。當創(chuàng )建一個(gè)新線(xiàn)程后,這個(gè)線(xiàn)程就進(jìn)入了排隊狀態(tài)(Ready),當線(xiàn)程中的方法start()被調用時(shí),線(xiàn)程就進(jìn)入生存周期,這時(shí)它的方法isAlive()始終返回真值,直至線(xiàn)程進(jìn)入死亡狀態(tài)。

線(xiàn)程的實(shí)現

有兩種方法可以實(shí)現線(xiàn)程,一種是擴展java.lang.Thread類(lèi),另一種是通過(guò)java.lang.Runnable接口。

Thread類(lèi)封裝了線(xiàn)程的行為。要創(chuàng )建一個(gè)線(xiàn)程,必須創(chuàng )建一個(gè)從Thread類(lèi)擴展出的新類(lèi)。由于在Thread類(lèi)中方法run()沒(méi)有提供任何的操作,因此,在創(chuàng )建線(xiàn)程時(shí)用戶(hù)必須覆蓋方法run()來(lái)完成有用的工作。當線(xiàn)程中的方法start()被調用時(shí),方法run()再被調用。下面的代碼就是通過(guò)擴展Thread類(lèi)來(lái)實(shí)現線(xiàn)程:

import java.awt.*;
class Sample1{
public static void main(String[] args){
Mythread test1=new Mythread(1);
Mythread test2=new Mythread(2);
test1.start();
test2.start();
}
}
class Mythread extends Thread {
int id;
Mythread(int i)
{ id=i;}
public void run() {
int i=0;
while(id+i==1){
try {sleep(1000);
} catch(InterruptedException e) {}
}
System.out.println(“The id is ”+id);
}

通常當用戶(hù)希望一個(gè)類(lèi)能運行在自己的線(xiàn)程中,同時(shí)也擴展其它某些類(lèi)的特性時(shí),就需要借助運行Runnable接口來(lái)實(shí)現。Runnable接口只有一個(gè)方法run()。不論什么時(shí)候創(chuàng )建了一個(gè)使用Runnable接口的類(lèi),都必須在類(lèi)中編寫(xiě)run()方法來(lái)覆蓋接口中的run()方法。例如下面的代碼就是通過(guò)Runnable接口實(shí)現的線(xiàn)程:

import java.awt.*;
import java.applet.Applet;
public class Bounce extends Applet implements Runnable{
static int r=30;
static int x=100;
static int y=30;
Thread t;
public void init()
{
t = new Thread(this);
t.start();
}
public void run()
{
int y1=+1;
int i=1;
int sleeptime=10;
while(true)
{
y+=(i*y);
if(y-rgetSize().height)
y1*=-1;
try{
t.sleep(sleeptime);
}catch(InterruptedException e){ }
}}
}

為什么要使用線(xiàn)程池

在Java中,如果每當一個(gè)請求到達就創(chuàng )建一個(gè)新線(xiàn)程,開(kāi)銷(xiāo)是相當大的。在實(shí)際使用中,每個(gè)請求創(chuàng )建新線(xiàn)程的服務(wù)器在創(chuàng )建和銷(xiāo)毀線(xiàn)程上花費的時(shí)間和消耗的系統資源,甚至可能要比花在處理實(shí)際的用戶(hù)請求的時(shí)間和資源要多得多。除了創(chuàng )建和銷(xiāo)毀線(xiàn)程的開(kāi)銷(xiāo)之外,活動(dòng)的線(xiàn)程也需要消耗系統資源。如果在一個(gè)JVM里創(chuàng )建太多的線(xiàn)程,可能會(huì )導致系統由于過(guò)度消耗內存或“切換過(guò)度”而導致系統資源不足。為了防止資源不足,服務(wù)器應用程序需要一些辦法來(lái)限制任何給定時(shí)刻處理的請求數目,盡可能減少創(chuàng )建和銷(xiāo)毀線(xiàn)程的次數,特別是一些資源耗費比較大的線(xiàn)程的創(chuàng )建和銷(xiāo)毀,盡量利用已有對象來(lái)進(jìn)行服務(wù),這就是“池化資源”技術(shù)產(chǎn)生的原因。

線(xiàn)程池主要用來(lái)解決線(xiàn)程生命周期開(kāi)銷(xiāo)問(wèn)題和資源不足問(wèn)題。通過(guò)對多個(gè)任務(wù)重用線(xiàn)程,線(xiàn)程創(chuàng )建的開(kāi)銷(xiāo)就被分攤到了多個(gè)任務(wù)上了,而且由于在請求到達時(shí)線(xiàn)程已經(jīng)存在,所以消除了線(xiàn)程創(chuàng )建所帶來(lái)的延遲。這樣,就可以立即為請求服務(wù),使應用程序響應更快。另外,通過(guò)適當地調整線(xiàn)程池中的線(xiàn)程數目可以防止出現資源不足的情況。

創(chuàng )建一個(gè)線(xiàn)程池

一個(gè)比較簡(jiǎn)單的線(xiàn)程池至少應包含線(xiàn)程池管理器、工作線(xiàn)程、任務(wù)隊列、任務(wù)接口等部分。其中線(xiàn)程池管理器(ThreadPool Manager)的作用是創(chuàng )建、銷(xiāo)毀并管理線(xiàn)程池,將工作線(xiàn)程放入線(xiàn)程池中;工作線(xiàn)程是一個(gè)可以循環(huán)執行任務(wù)的線(xiàn)程,在沒(méi)有任務(wù)時(shí)進(jìn)行等待;任務(wù)隊列的作用是提供一種緩沖機制,將沒(méi)有處理的任務(wù)放在任務(wù)隊列中;任務(wù)接口是每個(gè)任務(wù)必須實(shí)現的接口,主要用來(lái)規定任務(wù)的入口、任務(wù)執行完后的收尾工作、任務(wù)的執行狀態(tài)等,工作線(xiàn)程通過(guò)該接口調度任務(wù)的執行。下面的代碼實(shí)現了創(chuàng )建一個(gè)線(xiàn)程池,以及從線(xiàn)程池中取出線(xiàn)程的操作:

public class ThreadPool
{
private Stack threadpool = new Stack();
private int poolSize;
private int currSize=0;
public void setSize(int n)
{
poolSize = n;
}
public void run()
{
for(int i=0;i

線(xiàn)程池適合應用的場(chǎng)合

當一個(gè)Web服務(wù)器接受到大量短小線(xiàn)程的請求時(shí),使用線(xiàn)程池技術(shù)是非常合適的,它可以大大減少線(xiàn)程的創(chuàng )建和銷(xiāo)毀次數,提高服務(wù)器的工作效率。但如果線(xiàn)程要求的運行時(shí)間比較長(cháng),此時(shí)線(xiàn)程的運行時(shí)間比創(chuàng )建時(shí)間要長(cháng)得多,單靠減少創(chuàng )建時(shí)間對系統效率的提高不明顯,此時(shí)就不適合應用線(xiàn)程池技術(shù),需要借助其它的技術(shù)來(lái)提高服務(wù)器的服務(wù)效率。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Java中繼承thread類(lèi)與實(shí)現Runnable接口的區別
java多線(xiàn)程、線(xiàn)程池的實(shí)現
Java初級工程師面試題精選3
線(xiàn)程-1、創(chuàng )建線(xiàn)程的方式及實(shí)現
多線(xiàn)程的概念
Java并發(fā)編程之線(xiàn)程的創(chuàng )建
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久