進(jìn)程與線程:
1.進(jìn)程:進(jìn)程是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)攀圈,是一次程序的執(zhí)行抄瑟,是操作系統(tǒng)進(jìn)行資源分配與調(diào)度的一個獨(dú)立單位空扎。
2.線程:線程是進(jìn)程中獨(dú)立運(yùn)行的子任務(wù)臭墨。
Java新建線程的方式:
1.繼承Thread類:缺點(diǎn)是無法實(shí)現(xiàn)多繼承(Java只支持單繼承)赔嚎。
package cn.itcast.day06.demo3;
public class MyThread extends Thread{
@Override
public void run(){
System.out.println("繼承Thread類新建線程");
}
}
package cn.itcast.day06.demo3;
public class Demo3 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
2.實(shí)現(xiàn)Runnable接口:當(dāng)要實(shí)現(xiàn)的線程類已經(jīng)有一個父類了,這時就不能在繼承Thread類了胧弛,可以通過實(shí)現(xiàn)Runnable接口尤误。
package cn.itcast.day06.demo3;
public class MyRunnable implements Runnable{
@Override
public void run(){
System.out.println("實(shí)現(xiàn)Runnable接口新建線程");
}
}
package cn.itcast.day06.demo3;
public class Demo3 {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread myThread = new Thread(myRunnable);
myThread.start();
}
}
常用方法:
1.currentThread()方法:可以判斷當(dāng)前代碼段正在由哪個線程調(diào)用。
package cn.itcast.day06.demo3;
public class Demo3 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
}
}
2.isAlive()方法:判斷當(dāng)前線程是否存活叶圃,線程正在運(yùn)行或者準(zhǔn)備運(yùn)行就判為存活袄膏。
package cn.itcast.day06.demo3;
public class Demo3 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().isAlive());
}
}
3.sleep()方法:讓當(dāng)前線程休眠指定毫秒數(shù)sleep(int time)。
package cn.itcast.day06.demo3;
public class MyThread extends Thread{
@Override
public void run(){
System.out.println("begin:" + System.currentTimeMillis());
try {
Thread.sleep(2000);//當(dāng)前線程休眠2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end:" + System.currentTimeMillis());
}
}
package cn.itcast.day06.demo3;
public class Demo3 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
4.getId()方法:獲取當(dāng)前線程的唯一標(biāo)識符掺冠。
package cn.itcast.day06.demo3;
public class Demo3 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
System.out.println(myThread.getId());
}
}
5.yield()方法:該方法是讓當(dāng)前線程暫時放棄CPU資源沉馆,讓其他線程去占用CPU時間片,但是放棄的時間長短不確定德崭,有可能放棄很長時間斥黑,也有可能剛剛放棄又恢復(fù)執(zhí)行。
6.setPriority()方法:設(shè)置線程優(yōu)先級眉厨,線程優(yōu)先級范圍為1~10锌奴。系統(tǒng)優(yōu)先執(zhí)行優(yōu)先級高的線程,也就是盡量將資源分配給優(yōu)先級高的線程憾股,但是高優(yōu)先級的線程并不一定比低優(yōu)先級的線程先執(zhí)行完鹿蜀,二者沒有必然聯(lián)系箕慧。
停止線程的方法:
1.使用退出標(biāo)志,使線程正常退出茴恰,也就是當(dāng)run方法運(yùn)行結(jié)束后颠焦,退出線程;
2.使用interrupt()方法往枣;
3.使用stop()方法伐庭,不推薦使用,該方法已被拋棄分冈!
測試線程是否停止的方法:
守護(hù)線程Daemon:
守護(hù)線程相當(dāng)于是非守護(hù)線程的保姆圾另,當(dāng)系統(tǒng)中沒有非守護(hù)線程時,守護(hù)線程才會被銷毀雕沉,只要系統(tǒng)中還存在一個非守護(hù)線程集乔,那么守護(hù)線程就會存在。Java中典型的一個守護(hù)線程就是垃圾回收線程蘑秽。