Bootstrap

JAVA多线程(学习笔记)(02)

这节学习了JAVA多线程中的常用成员方法

1.成员方法列表

2.第一部分(前四个方法)

细节

方法1/方法2

String getName()  返回此线程的名称

void setName(string name)设置线程的名字(构造方法也可以设置名字)

测试

package AText.多线程.T04_Threadmethod.P1;

public class Demo {
    public static void main(String[] args) {
        P1Class pc = new P1Class();
        pc.setName("PPP1");
        pc.start();
    }
}
package AText.多线程.T04_Threadmethod.P1;

public class P1Class extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(getName() + "线程执行");
        }
    }
}

测试结果

PPP1线程执行
PPP1线程执行
PPP1线程执行
PPP1线程执行
... ...

方法3

static Thread currentThread()获取当前线程的对象

测试

package AText.多线程.T04_Threadmethod.P3;

public class Demo {
    public static void main(String[] args) {
        Thread t = Thread.currentThread();
        System.out.println(t.getName());
    }
}

测试结果

main

方法4

sleep(long time) 让线程休眠指定的时间,单位为毫秒

测试

package AText.多线程.T04_Threadmethod.P4;

public class Demo {
    public static void main(String[] args) {
        P4Class pc1 = new P4Class("PC1");
        P4Class pc2 = new P4Class("PC2");

        pc1.start();
        pc2.start();
    }
}
package AText.多线程.T04_Threadmethod.P4;

public class P4Class extends Thread{

    public P4Class() {
    }

    public P4Class(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(getName() + "程序执行:" + i);
        }
    }
}

测试结果

PC1程序执行:0
PC2程序执行:0
PC1程序执行:1
PC2程序执行:1
PC1程序执行:2
PC2程序执行:2
PC1程序执行:3
PC2程序执行:3

... ...

3.第二部分

方法5(线程的优先级) 

测试

package AText.多线程.T04_Threadmethod.P5;

public class Demo {
    public static void main(String[] args) {
        P5Class pc1 = new P5Class();
        P5Class pc2 = new P5Class();

        pc1.setPriority(1);pc1.setName("低优先级线程");
        pc2.setPriority(10);pc2.setName("高优先级线程");

        pc1.start();
        pc2.start();
    }
}
package AText.多线程.T04_Threadmethod.P5;

public class P5Class extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + "线程执行" + i);
        }
    }
}

测试结果

... ...

高优先级线程线程执行0
高优先级线程线程执行1
低优先级线程线程执行5
高优先级线程线程执行2
低优先级线程线程执行6
低优先级线程线程执行7

... ...

 方法6(守护线程)

测试(两个类的创建和一个测试程序)

package AText.多线程.T04_Threadmethod.P6;

public class P6Class1 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("线程一执行:" + i);
        }
    }
}
package AText.多线程.T04_Threadmethod.P6;

public class P6Class2 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("线程二(守护线程)执行:" + i);
        }
    }
}
package AText.多线程.T04_Threadmethod.P6;

public class Demo {
    public static void main(String[] args) {
        P6Class1 p1 = new P6Class1();
        P6Class2 p2 = new P6Class2();

        p2.setDaemon(true);//设置为守护线程

        p1.start();
        p2.start();

    }
}

测试结果

线程一执行:0
线程一执行:1
线程一执行:2
线程一执行:3
线程二(守护线程)执行:0
线程一执行:4
线程一执行:5
线程二(守护线程)执行:1
线程一执行:6
线程一执行:7
线程一执行:8
线程一执行:9
线程二(守护线程)执行:2
线程二(守护线程)执行:3
线程二(守护线程)执行:4
线程二(守护线程)执行:5
线程二(守护线程)执行:6
线程二(守护线程)执行:7
线程二(守护线程)执行:8
线程二(守护线程)执行:9
线程二(守护线程)执行:10
线程二(守护线程)执行:11
线程二(守护线程)执行:12
线程二(守护线程)执行:13
线程二(守护线程)执行:14

 可以看到测试结果中,线程二(守护线程)设置了100次循环,却只执行在14次就停止了,这是因其设置为守护线程,线程一结束后,过段时间线程二(守护线程)就会自动结束

 方法7(礼让线程/出让线程)

测试

package AText.多线程.T04_Threadmethod.P7;

public class Demo {
    public static void main(String[] args) {
        P7Class pc1 = new P7Class();
        P7Class pc2 = new P7Class();

        pc1.setName("线程一");
        pc2.setName("线程二");

        pc1.start();
        pc2.start();
    }
}
package AText.多线程.T04_Threadmethod.P7;

public class P7Class extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + "线程执行" + i);
            //表示出让CPU的控制权
            Thread.yield();
        }
    }
}

测试结果

...

线程一线程执行36
线程二线程执行51
线程一线程执行37
线程二线程执行52
线程二线程执行53
线程二线程执行54
线程二线程执行55
线程二线程执行56
线程一线程执行38
线程二线程执行57
线程一线程执行39
线程二线程执行58
线程一线程执行40

...

(会让线程的分布尽可能的均匀)

 方法8(插入线程/插队线程)

测试

package AText.多线程.T04_Threadmethod.P8;

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        P8Class pc = new P8Class();
        pc.start();

        //表示把pc这个线程插入到当前线程之前
        //pc:线程一
        //当前线程:main线程
        pc.join();
        
        for (int i = 0; i < 10; i++) {
            System.out.println("main线程执行" + i);
        }

    }
}
package AText.多线程.T04_Threadmethod.P8;

public class P8Class extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("线程一执行" + i);
        }
    }
}

测试结果

线程一执行0
线程一执行1
线程一执行2
线程一执行3
线程一执行4
线程一执行5
线程一执行6
线程一执行7
线程一执行8
线程一执行9
main线程执行0
main线程执行1
main线程执行2
main线程执行3
main线程执行4
main线程执行5
main线程执行6
main线程执行7
main线程执行8
main线程执行9

;