1薛耻、繼承Thread類(lèi)
public class ThreadTest01 {
public static void main(String[] args) {
MyThread myThread1 = new MyThread("周星馳");
MyThread myThread2 = new MyThread("成龍");
myThread1.start();
myThread2.start();
}
}
1.1、繼承Thread類(lèi)
1.2赏陵、復(fù)寫(xiě)run方法
1.3饼齿、new 新的類(lèi)對(duì)象
1.4、調(diào)用新類(lèi)的start方法
class MyThread extends Thread{
private String name;
public MyThread(String name){
this.name = name;
}
public void run(){
for(int i=0;i<100;i++){
try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("------>"+name+"--->"+i);
}
}
}
2蝙搔、實(shí)現(xiàn)Runnable接口(使用靜態(tài)代理的方式實(shí)現(xiàn)的)
public class ThreadTest02 {
public static void main(String[] args) {
MyThread02 myThread1 = new MyThread02("周星馳");
MyThread02 myThread2 = new MyThread02("成龍");
Thread thread1 = new Thread(myThread1);
Thread thread2 = new Thread(myThread2);
thread1.start();
thread2.start();
}
}
2.1缕溉、實(shí)現(xiàn)Runnable接口
2.2、復(fù)寫(xiě)run方法
2.3吃型、new 新的類(lèi)對(duì)象
2.4倒淫、new一個(gè)Thread對(duì)象(傳入上面的對(duì)象)
2.5、Thread對(duì)象調(diào)用start方法啟動(dòng)線程
class MyThread02 implements Runnable{
private String name;
public MyThread02(String name){
this.name = name;
}
public void run() {
for(int i=0;i<100;i++){
try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("------>"+name+"--->"+i);
}
}
}
3败玉、實(shí)現(xiàn)Callable接口
public class ThreadTest03 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService ser = Executors.newFixedThreadPool(2);
MyThread03 myThread1 = new MyThread03("周星馳");
MyThread03 myThread2 = new MyThread03("成龍");
Future<String> future1 =ser.submit(myThread1);
Future<String> future2 =ser.submit(myThread2);
Thread.sleep(5000);
myThread1.setFlag(false);
myThread2.setFlag(false);
String result1 =future1.get();
String result2 =future2.get();
System.out.println("-----------------------");
System.out.println(result1);
System.out.println(result2);
ser.shutdownNow();
}
}
3.1敌土、實(shí)現(xiàn)Callable接口
3.2、復(fù)寫(xiě)call方法(返回值類(lèi)型需與Callable接口的泛型一致)
3.3运翼、ExecutorService ser = Executors.newFixedThreadPool(2)創(chuàng)建一個(gè)線程池返干,用于啟動(dòng)線程
3.4、new一個(gè)線程對(duì)象
3.5血淌、定義一個(gè)Future類(lèi)型的參數(shù)接受線程池提交的線程對(duì)象后的“未來(lái)值”
3.6矩欠、通過(guò)Future的get()方法,獲取到線程返回的值悠夯,該方法會(huì)阻塞線程癌淮,即調(diào)用該方法后,主線程會(huì)等到新啟的線程
結(jié)束拿到結(jié)果后沦补,才會(huì)執(zhí)行后面的代碼
3.7乳蓄、調(diào)用shutdownNow()方法,關(guān)閉線程池(否則主線程不會(huì)結(jié)束)
class MyThread03 implements Callable<String>{
private String name;
private boolean flag =true;
public MyThread03(String name){
this.name = name;
}
public String call() throws Exception {
int i = 0;
while(flag){
try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
i++;
System.out.println("------>"+name+"--->"+i);
}
return name;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
4夕膀、三種特殊寫(xiě)法
public class ThreadTest04 {
public static void main(String[] args) {
new Thread(){
private String name ="周星馳";
public void run(){
for(int i=0;i<100;i++){
try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("------>"+name+"--->"+i);
}
}
}.start();
new Thread(new Runnable(){
private String name ="成龍";
public void run() {
for(int i=0;i<100;i++){
try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("------>"+name+"--->"+i);
}
}
}).start();
new Thread(new Thread(){
private String name ="李連杰";
public void run() {
for(int i=0;i<100;i++){
try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("------>"+name+"--->"+i);
}
}
}).start();
}
}
5虚倒、Join()方法美侦,合并線程,是把被調(diào)用的線程合并到主線程中魂奥,并行變串行菠剩,主線程進(jìn)入等待,直到被合并進(jìn)來(lái)的線程執(zhí)行完后耻煤,主線程才繼續(xù)進(jìn)行
public class ThreadTest05 extends Thread{
private String name;
public ThreadTest05(String name){
this.name = name;
}
public static void main(String[] args) {
ThreadTest05 threadTest05 = new ThreadTest05("成龍");
Thread thread = new Thread(threadTest05);
thread.start();
for(int i=0;i<100;i++){
if(i==50){try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}}
try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("------>main--->"+i);
}
}
public void run(){
for(int i=0;i<100;i++){
try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("------>"+name+"--->"+i);
}
}
}
此程序先是兩線程一起跑具壮,等到主線程I==50時(shí),主線程停下哈蝇,等待子線程thread執(zhí)行完棺妓,主線程才繼續(xù)執(zhí)行
6、yield()方法买鸽,暫停線程(把自己的CPU時(shí)間片讓出),直到CPU再分給時(shí)間片才會(huì)繼續(xù)運(yùn)行贯被,此方法為static方法眼五,Thread.yield(),寫(xiě)在哪個(gè)線程,哪個(gè)線程就暫停彤灶,與sleep相似
public class ThreadTest06 extends Thread{
private String name;
public ThreadTest06(String name){
this.name = name;
}
public static void main(String[] args) {
ThreadTest06 threadTest06 = new ThreadTest06("成龍");
Thread thread = new Thread(threadTest06);
thread.start();
for(int i=1;i<100;i++){
if(i%20==0){Thread.yield();}
System.out.println("------>main--->"+i);
}
}
public void run(){
for(int i=0;i<100;i++){
System.out.println("------>"+name+"--->"+i);
}
}
}
7看幼、Sleep()方法,讓線程睡眠幌陕,static方法诵姜,太常見(jiàn),例子略
Thread.currentThread()獲取當(dāng)前線程static方法搏熄,thread.setName("name")給線程設(shè)置名稱(chēng)棚唆,thread.getName()獲取線程名稱(chēng)
thread.isAlive()判斷線程是否是存活狀態(tài)