這篇文章主要講解了“Java中多線程怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java中多線程怎么實(shí)現(xiàn)”吧!
成都創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)營(yíng)銷推廣、網(wǎng)站重做改版、青銅峽網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為青銅峽等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
線程是一些可以并行的,獨(dú)立的執(zhí)行的代碼.之前我編的程序都只能做一件事情,也就是只有一個(gè)線程.多線程的編程就是可以將程序任務(wù)分成多個(gè)并行的子任務(wù),同時(shí)運(yùn)行,互不干擾.我對(duì)多線程的理解是從格斗游戲得來(lái)的.格斗游戲中兩人對(duì)打就是通過(guò)兩個(gè)線程來(lái)實(shí)現(xiàn)的吧,否則如何能夠你出你的招,我發(fā)我的沖擊波呢.
(1月18日)突然想到一個(gè)問(wèn)題,補(bǔ)充一下.多線程是不是我們通常所說(shuō)的多任務(wù)呢?我的理解是,不能這樣說(shuō)也可以這樣說(shuō).
簡(jiǎn)單說(shuō)來(lái),多線程提供了一種在進(jìn)程內(nèi)部進(jìn)行多個(gè)線程并行調(diào)度的機(jī)制,而多任務(wù)則提供的是在一個(gè)操作系統(tǒng)內(nèi)部運(yùn)行多個(gè)進(jìn)程的機(jī)制.
多任務(wù)操作系統(tǒng)(如windows)的基本原理是這樣的:操作系統(tǒng)將cpu的時(shí)間片分配給多個(gè)線程,每個(gè)線程在操作系統(tǒng)指定的時(shí)間片內(nèi)完成(注意,這里的多個(gè)線程是分屬于不同進(jìn)程的).操作系統(tǒng)不斷的從一個(gè)線程的執(zhí)行切換到另一個(gè)線程的執(zhí)行,如此往復(fù),宏觀上看來(lái),就好像是多個(gè)線程在一起執(zhí)行.由于這多個(gè)線程分屬于不同的進(jìn)程,因此在我們看來(lái),就好像是多個(gè)進(jìn)程在同時(shí)執(zhí)行,這樣就實(shí)現(xiàn)了多任務(wù).Whoops,真繞口.
如上,多線程和多任務(wù)是有很明顯的區(qū)別的.但是再想一下,在一個(gè)應(yīng)用程序內(nèi)實(shí)現(xiàn)多線程不也是靠CPU分配時(shí)間片嗎?既然原理是相同的,那么多線程也可以說(shuō)是多任務(wù)的.
一個(gè)Java程序啟動(dòng)后,就已經(jīng)有一個(gè)線程在運(yùn)行,我們可以通過(guò)下面的例子來(lái)初步建立一個(gè)線程的實(shí)際印象
class testthread{
public static void main(String args[]){
Thread t=Thread.currentThread();
t.setName("This Thread is running");
System.out.println("The running thead:"+t);
try{
for(int i=0;i<5;i++)
{
System.out.println("Sleep time"+i);
Thread.sleep(1000);//掛起線程,就是讓線程休息一會(huì)兒,不占用系統(tǒng)資源,因此其它線程可以繼續(xù).這里的Thread缺省表示主線程
}
}catch(InterruptedException e){System.out.println("thread has wrong");}
}
}
這只是一個(gè)線程,那么我們?cè)趺磳?shí)現(xiàn)多個(gè)線程呢?又怎樣讓線程做我安排它要做的事情呢?
實(shí)現(xiàn)線程體的構(gòu)造有兩種方法.
第一種方法是通過(guò)繼承構(gòu)造線程體.
在Java中專門有一個(gè)Thread類,這個(gè)類里面有一個(gè)函數(shù)run(),里面記錄著線程要完成的操作,就好像通常所說(shuō)的主函數(shù)main()一樣,run()函數(shù)運(yùn)行完了,線程就結(jié)束了.通過(guò)繼承這個(gè)類,我們可以定義我們自己的線程,在run函數(shù)中告訴它該做什么事情.下面的程序就是繼承了一個(gè)SimpleThread類,用兩個(gè)線程來(lái)輸出HelloWorld.
public class TwoThread{
public static void main(String args[]){
new SimpleThread("HelloWorld1").start();//創(chuàng)建兩個(gè)線程的實(shí)例,就這么簡(jiǎn)單
new SimpleThread("HelloWorld2").start();
}
}
class SimpleThread extends Thread{ file://真正的內(nèi)容在這里
public SimpleThread(String str){
super(str);//super代表SimpleThread類的直接父類,這里就是Thread
}
file://我們要線程做的事情都在這里了
public void run(){
for(int i=0;i<10;i++){
System.out.println(i+" "+getName());
try{
sleep((int)(Math.random()*1000));
}catch(InterruptedException e){}
}
System.out.println("Done!"+getName());
}
}
運(yùn)行的結(jié)果是兩個(gè)線程交替顯示各自的HelloWorld十次,輸出是混在一起的,因?yàn)閮蓚€(gè)線程是同時(shí)運(yùn)行的.
第二種方法是通過(guò)啟動(dòng)接口構(gòu)造線程體.在任意實(shí)現(xiàn)了啟動(dòng)接口的類當(dāng)中,比如下面的twothread類,都可以實(shí)現(xiàn)多線程,我所需要做的就是在這個(gè)類的定義當(dāng)中加上一個(gè)run函數(shù).例程如下
class TwoThread implements Runnable{
TwoThread(){
Thread t1=Thread.currentThread();
t1.setName("The first main thread");
System.out.println("The running thead:"+t1);
Thread t2=new Thread(this,"the second thread");//注意這里的this,它表明新線程即t2將會(huì)做的事情由this對(duì)象來(lái)決定,也就是由twothread的run函數(shù)來(lái)決定
System.out.println("create another thread");
t2.start();//調(diào)用該函數(shù)將使線程從run函數(shù)開始執(zhí)行
try{
System.out.println("first thread will sleep");
Thread.sleep(3000);
}catch(InterruptedException e){System.out.println("first thread has wrong");}
System.out.println("first thread exit");
}
public void run()//定義run()函數(shù),在本程序中也就是t2這個(gè)新的線程會(huì)做的事情
{
try{
for(int i=0;i<5;i++)
{
System.out.println("sleep time for thread 2:"+i);
Thread.sleep(1000);
}
}catch(InterruptedException e){System.out.println("thread has wrong");}
System.out.println("second thread exit");
}
public static void main(String args[]){
new TwoThread();//觸發(fā)構(gòu)造函數(shù)
}
}
運(yùn)行的結(jié)果如下:
The running rhread:Thread[The first main thread,5,main]
creat another thread
first thread will sleep
Sleep time for thread 2:0
Sleep time for thread 2:1
Sleep time for thread 2:2
first thread exit
Sleep time for thread 2:3
Sleep time for thread 2:4
second thread exit
扯扯別的.我們注意到很多Java程序開頭都有import語(yǔ)句,好像和C的#include和Delphi的uses很象哦.import是Java的關(guān)鍵詞,負(fù)責(zé)調(diào)入包(package).包由一組類和界面組成,是管理大型名字空間,避免名字沖突的工具.
Java提供了很多包供我們使用,主要如下:
java.applet
設(shè)計(jì)Applet的類
java.awt
窗口工具包,包含了產(chǎn)生GUI元素的類
java.io
文件輸入輸出類
java.lang
java語(yǔ)言類,包含:對(duì)象,線程,異常出口,系統(tǒng),整數(shù),原點(diǎn),數(shù)字,字符等
java.NET
Socket類及與TCP/IP相關(guān)的類
java.util
一些程序的同步類
感謝各位的閱讀,以上就是“Java中多線程怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java中多線程怎么實(shí)現(xiàn)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!