JAVA多線程基礎-建立和使用

1.線程的建立 需繼承Thread,並重寫run方法java

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i=0;i<100;i++){
            if(i%2==0){
                System.out.println(i);
            }
        }
    }
}

2.線程的使用ide

實例化,並調用Start()方法測試

獲取當前線程名稱的方法:this

Thread.currentThread().getName()
public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("hello");
    }

3. 問題1 ,不能直接調用run()方法啓動線程線程

    直接調用run方法不會啓用線程,會在調用run方法的線程內執行code

4.問題2 ,線程實例不能再次start 會報 IllegalThreadStateException異常對象

    能夠再實例化一個線程對象。繼承

5.練習生命週期

/*
* 練習:建立兩個分線程,1 遍歷100內偶數 2 遍歷100內奇數
* */
public class ThreadDemo {
    public static void main(String[] args) {
        //1.建立對象方式
/*        MyThread1 myThread1 = new MyThread1();
        MyThread2 myThread2 = new MyThread2();
        myThread1.start();
        myThread2.start();*/
        //2.建立Thread類的匿名子類方式
        new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    if(i%2==0){
                        System.out.println(Thread.currentThread().getName()+" :  "+ i);
                    }
                }
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    if(i%2!=0){
                        System.out.println(Thread.currentThread().getName()+" : " +i);
                    }
                }
            }
        }.start();

    }

}
class MyThread1 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i%2==0){
                System.out.println(Thread.currentThread().getName()+" :  "+ i);
            }
        }
    }
}
class MyThread2 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i%2!=0){
                System.out.println(Thread.currentThread().getName()+" : " +i);
            }
        }
    }
}

6. Thread 的經常使用方法隊列

  • void start() :啓動線程,並執行對象的run()方法
  • run();             線程在被調度時執行的操做
  • String getName()                         返回線程的名稱
  • void setName(String name) :     設置該線程的名稱
  • static Thread currentThread(): 返回當前線程。在Thead子類中就是this ,一般用於主線程和Runable實現類
  • static void yied():線程讓步
    • 暫停當前正在執行的線程,把執行機會讓給優先級相同或更高的線程
    • 若隊列中沒有同優先級的線程,忽略此方法
  • join() 當某個程序執行流中調用其餘線程的join()方法時,調用線程將被阻塞,直到join()方法加入的join線程執行完畢爲止
    • 低優先級的線程也能夠得到執行
  • static void sleep(long millis): 指定時間:毫秒
    • 令當前活動線程在指定時間段內放棄對CPU控制,使其餘線程有機會被執行,時間到後重排隊。
    • 拋出InterruptedException異常
  • stop() 強制線程生命期結束,不推薦使用
  • boolean isAlive(): 返回boolean 判斷線程是否還活着
package com.zhanghl.service;

/*
* 測試Thread類中的經常使用方法:
* 1.start() :啓動線程,並執行對象的run()方法
* 2.run(): 一般須要重寫Thread類中的此方法,將建立的線程要執行的操做聲明再此方法中
* 3.currentThread(): 返回當前代碼執行的線程,靜態方法
* 4.getName():獲取當前線程的方法
* 5.setName(): 設置當前線程的方法
* 6.yield() 線程讓步
* 7.join() 在線程A中調用線程B的join(),此時線程A進入阻塞狀態,
*           直到線程B徹底執行完之後,線程A纔會結束阻塞狀態
* 8.stop() 強制線程生命週期中止。不推薦使用,已過期
* 9.sleep(long millitime) 讓當前線程睡眠指定的millitime毫秒,在指定的millitime毫秒時間內,當前線程時阻塞裝
* 10. isAlive() 判斷當前線程是否存活
* */
public class ThreadMethodTest {
    public static void main(String[] args) {
        /*構造器方式命名*/
        HelloThread h1 = new HelloThread("線程1");
        //h1.setName("線程一");
        h1.start();
        /*給主線程命名*/
        Thread.currentThread().setName("主線程");
        for (int i = 0; i < 100; i++) {
            if(i%2==0){
                System.out.println(Thread.currentThread().getName()+" :  "+ i);
            }
            /*當i==20時 讓子線程 h1 先執行 ,執行完畢再回到主線程*/
            if (i==20){
                try {
                    h1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("h1.isAlive()"+h1.isAlive());
    }

}
class HelloThread extends Thread{
    @Override
    public void run() {

        for (int i = 0; i < 100; i++) {
            if(i%2!=0){
                try {
                    //睡眠1秒
                    sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+" :  "+ i);
            }
            /*yield釋放執行權*/
            /*if(i%10==0){
                this.yield();
            }*/
        }

    }
    public HelloThread(){}
    /*利用Thread 類中 使用名稱實例化的方法*/
    public HelloThread(String name){
        super(name);
    }
}
相關文章
相關標籤/搜索