一:線程與之前所學(xué)的進(jìn)程區(qū)別:
進(jìn)程:系統(tǒng)進(jìn)行資源分配的最小單位,資源是獨(dú)立的
線程:CPU調(diào)度的最小的單位,線程間共享資源。多線程幾個(gè)線程共占據(jù)一個(gè)進(jìn)程,單線程獨(dú)占一個(gè)線程。
公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出澤庫免費(fèi)做網(wǎng)站回饋大家。
主線程就像是前臺(tái)接待,當(dāng)工作量太多時(shí),就指揮子線程去完成對應(yīng)工作。
二,如何創(chuàng)建線程
繼承Thread類和實(shí)現(xiàn)Runnable接口。
在使用Runnable接口時(shí)需要建立一個(gè)Thread實(shí)例。因此,無論是通過Thread類還是Runnable接口建立線程,都必須建立Thread類或它的子類的實(shí)例。
Thread構(gòu)造函數(shù):
public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
第一類:
public class ThreadDemo{
public static void main(String[] args){
Demo d = new Demo();//創(chuàng)建多線程
d.start();//啟動(dòng)線程
for(int i=0;i<60;i++){
System.out.println(Thread.currentThread().getName()+i);//打印當(dāng)前線程名稱
}
}
}
class Demo extends Thread{//繼承thread類
public void run(){//run方法相當(dāng)于線程的行動(dòng)指南(做什么工作)
for(int i=0;i<60;i++){
System.out.println(Thread.currentThread().getName()+i);//打印名字
}
}
}
第二類:
public class ThreadDemo{
public static void main(String[] args){
Demo d =new Demo();
Thread t = new Thread(d);//Thread類或它的子類的實(shí)例。
t.start();
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
class Demo implements Runnable{
public void run(){
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
三:如何終止線程。
使用退出標(biāo)志,使線程正常退出,也就是當(dāng)run方法完成后線程終止。
使用stop方法強(qiáng)行終止線程(這個(gè)方法不推薦使用,可能發(fā)生不可預(yù)料的結(jié)果)。
使用interrupt方法中斷線程。
舉例子:A通知B A.interrupt() A將指示燈置亮,B發(fā)生中斷,(如果B睡著的話,會(huì)存在通知不及時(shí)的情況)
B如何查看指示燈狀態(tài)。Thread.interrupted()和Thread.isinterrupted()
Thread.isinterrupted()會(huì)將指示燈復(fù)位,置回原來的狀態(tài)??刹榭慈我饩€程的狀態(tài)。
Thread.interrupted()不會(huì)將指示燈復(fù)位,只可查看當(dāng)前線程的狀態(tài)。
四:多線程安全問題
問題原因:當(dāng)多條語句在操作同一個(gè)線程共享數(shù)據(jù)時(shí),一個(gè)線程對多條語句只執(zhí)行了一部分,還沒執(zhí)行完,另一個(gè)線程參與進(jìn)來執(zhí)行,導(dǎo)致共享數(shù)據(jù)的錯(cuò)誤。
解決辦法:對多條操作共享數(shù)據(jù)的語句,只能讓一個(gè)線程都執(zhí)行完,在執(zhí)行過程中,其他線程不執(zhí)行。
兩個(gè)關(guān)鍵字:
volatile修飾變量,實(shí)現(xiàn)可見性,當(dāng)線程的工作內(nèi)存數(shù)據(jù)改變,主內(nèi)存也隨之改變,
synchronized修飾方法,實(shí)現(xiàn)加鎖功能,當(dāng)CPU發(fā)生調(diào)度時(shí),保證自己的工作不會(huì)受別人打擾。
同步代碼塊:
public class ThreadDemo3 {
public static void main(String[] args){
Ticket t =new Ticket();
Thread t1 = new Thread("線程一");
Thread t2 = new Thread("線程二");
Thread t3 = new Thread("線程三");
Thread t4 = new Thread("線程四");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Ticket implements Runnable{
private int ticket =400;
public void run(){
while(true){
synchronized (new Object()) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(ticket<=0)
break;
System.out.println(Thread.currentThread().getName()+ticket--);
}
}
}
}
同步函數(shù):
public class ThreadDemo3 {
public static void main(String[] args){
Ticket t =new Ticket();
Thread t1 = new Thread("線程一");
Thread t2 = new Thread("線程二");
Thread t3 = new Thread("線程三");
Thread t4 = new Thread("線程四"););
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Ticket implements Runnable{
private int ticket = 4000;
public synchronized void saleTicket(){
if(ticket>0)
System.out.println(Thread.currentThread().getName()+ticket--);
}
public void run(){
while(true){
saleTicket();
}
}
}