Java
線程阻塞
join
public class joinThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("join......");
}
}
}
public void test1Thread() throws InterruptedException {
joinThread thread = new joinThread(); // 新生
thread.start(); // 就緒
for (int i = 0; i < 1000; i++) {
if (50 == i) {
thread.join(); // main方法阻塞
}
System.out.println("main......");
}
}
join:一個(gè)線程在占有CPU資源期間柴我,可以讓其他線程調(diào)用join方法和本線程聯(lián)合狈涮。當(dāng)前線程等待調(diào)用該方法的線程結(jié)束后垃沦,在重新排隊(duì)等待CPU資源懂牧,以便恢復(fù)執(zhí)行。
yield
public class yieldThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("yield......");
}
}
}
public void test2Thread() {
yieldThread thread = new yieldThread();
thread.start();
for (int i = 0; i < 1000; i++) {
if (i % 20 == 0) {
Thread.yield();// 這個(gè)方法寫(xiě)在哪個(gè)線程皱坛,就暫停哪個(gè)線程
}
}
}
yield:指當(dāng)前線程愿意讓出當(dāng)前的CPU資源编曼,但是讓出多久并沒(méi)有規(guī)定,所以并不能打亂CPU的調(diào)度剩辟。此方法在哪個(gè)線程中調(diào)用掐场,就暫時(shí)性的暫停哪個(gè)線程。此方法是一個(gè)靜態(tài)方法贩猎。
sleep
靜態(tài)方法熊户,sleep:休眠,不釋放鎖融欧,放棄CPU資源敏弃。
- 與時(shí)間相關(guān):倒計(jì)時(shí)
- 模擬網(wǎng)絡(luò)延時(shí)
/**
* 倒計(jì)時(shí)
* 倒數(shù)10個(gè)數(shù)卦羡,一秒內(nèi)打印一個(gè)
* @throws InterruptedException
*/
public void threadSleep1() throws InterruptedException {
int num = 10;
while (true) {
Log.d("WM",(num--) + "");
Thread.sleep(1000); // 暫停一秒
if (num <= 0) {
break;
}
}
}
public void threadSleep2() throws InterruptedException {
Date endTime = new Date(System.currentTimeMillis() + 10 * 1000);
long end = endTime.getTime();
while (true) {
// 輸出
Log.d("WM",new SimpleDateFormat("mm:ss").format(endTime) + "");
// 等待一秒
Thread.sleep(1000);
// 構(gòu)建下一秒時(shí)間
endTime = new Date(endTime.getTime() - 1000);
// 10秒以內(nèi)繼續(xù)
if (end - 10000 > endTime.getTime()) {
break;
}
}
}
線程的優(yōu)先級(jí)
isAlive()
判斷線程是否還"活著"噪馏,即線程是否還未終止。getPriority()
獲得線程的優(yōu)先級(jí)數(shù)值setPriority()
設(shè)置線程的優(yōu)先級(jí)數(shù)值setName()
給線程一個(gè)名字getName()
取得線程的名字currentThread()
取得當(dāng)前正在運(yùn)行的線程對(duì)象也就是取得自己本身
public class MyThread implements Runnable {
private boolean flag = true;
private int number = 0;
@Override
public void run() {
while (flag) {
Log.d("WM",(Thread.currentThread().getName()) + "--->" +(number++) + "");
}
}
public void stop() {
this.flag = !this.flag;
}
}
給線程設(shè)置名字
public void test() throws InterruptedException {
MyThread it = new MyThread();
Thread proxy = new Thread(it);
proxy.setName("test1");
Log.d("WM",proxy.getName());
proxy.start();
Log.d("WM",Thread.currentThread().getName()); // 主線程 main
Thread.sleep(200);
it.stop();
}
默認(rèn)優(yōu)先級(jí)
public void test() throws InterruptedException {
MyThread it1 = new MyThread();
Thread p1 = new Thread(it1);
MyThread it2 = new MyThread();
Thread p2 = new Thread(it2);
p1.start();
p2.start();
Thread.sleep(100);
it1.stop();
it2.stop();
}
線程的優(yōu)先級(jí)
/**
* 優(yōu)先級(jí):概率绿饵,不是絕對(duì)的先后順序欠肾,而是運(yùn)行的概率
* MAX_PRIORITY 最大優(yōu)先級(jí) (10)
* NORM_PRIORITY 默認(rèn)優(yōu)先級(jí)(5)
* MIN_PRIORITY 最小優(yōu)先級(jí) (0)
* @throws InterruptedException
*/
public void test() throws InterruptedException {
MyThread it1 = new MyThread();
Thread p1 = new Thread(it1);
MyThread it2 = new MyThread();
Thread p2 = new Thread(it2);
p1.setPriority(Thread.MAX_PRIORITY);
p2.setPriority(Thread.MIN_PRIORITY);
p1.start();
p2.start();
Thread.sleep(100);
it1.stop();
it2.stop();
}