0
点赞
收藏
分享

微信扫一扫

【Java笔记】多线程的创建与使用

青鸾惊鸿 2022-03-30 阅读 66

Java 语言的 JVM 允许运行多个线程,它通过 java . lang . Thread 类来体现。

目录

多线程的创建方式一:继承Thread类

多线程的创建方式二:实现Runnable接口

线程的常用方法

线程优先级的设置

Java 中给出的优先级

如何获取和设置当前线程的优先级


多线程的创建方式一:继承Thread类

每个线程都是通过某个特定的 Thread 对象的 run()方法来完成操作的,经常把 run()方法的主体称为线程体

通过该 Thread 对象的 start()方法来启动这个线程,而非直接调用 run()

//1. 创建一个继承于 Thread 类的子类
class Test extends Thread{
    //2. 重写 Thread 类的 run()
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0){
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}
public class myTest{
    public static void main(String[] args) {
    //3. 创建 Thread 类的子类的对象
    Test t = new Test();
    //4. 通过此对象调用 start():启动当前线程,调用当前线程的 run()
    t.start();
    //5. 再启动一个线程,不可以让已经 start() 的线程去执行,需要再创建一个线程对象
    Test t1 = new Test();
    t1.start();
    }
}

>>> Thread-0:0
    ......
    Thread-0:98

注:我们不能通过直接调用 run()的方式启动分线程,因为此时启动的是(main)主线程

多线程的创建方式二:实现Runnable接口

开发中优先选择 Runnable 接口方式

1. 实现的方式没有类的单继承性

2. 实现的方式更适合来处理多个线程有共享数据的情况

3. public class Thread implements Runnable

//1.创建一个实现了Runnable接口的类
class Test1 implements Runnable{
    //Runnable 可以让多个线程共享数据,也就是所有线程的票总共100,而不是一个线程100,此前提是        
    //Test1只实例化一次
    private int ticket = 100; 
    //2. 实现类去实现Runnable中的抽象方法 run()
    @Override
    public void run() {
        while(true){
            if (ticket > 0){
                System.out.println(Thread.currentThread().getName() + "号码是:" + ticket);
                ticket--;
            }else {
                break;
            }
        }
    }
}
public class RunnableTest {
    public static void main(String[] args) {
        //3. 创建实现类的对象
        Test1 test1 = new Test1();
        //4. 将此对象作为参数传递到 Thread 类的构造器中,创建 Thread 类的对象
        Thread t = new Thread(test1);
        Thread t1 = new Thread(test1);
        //5. 通过 Thread 类的对象调用 start()
        t.start();
        t1.start();
    }
}

线程的常用方法

start()启动当前线程,调用当前线程的 run()
run()通常需要重写 Thread 类中的此方法,将创建的线程要执行的操作声明在此方法中

currentThread()

静态方法,返回执行当前代码的线程
getName()获取当前线程的名字
setName()设置当前线程的名字
yield()释放当前 cpu 的执行权
join()在线程 a 中调用线程 b 得 join(),此时线程 a 就进入阻塞状态,直到线程 b 完全执行完以后,线程 a 才结束阻塞状态
stop()当执行此方法时,强制结束当前线程
sleep(long millitime)让当前线程 “睡眠” 指定的 millitime 毫秒
isAlive()判断当前线程是否存活

线程优先级的设置

Java 中给出的优先级

MAX_PRIORITY = 10

MIN_PRIORITY = 1

NORM_PRIORITY = 5

如何获取和设置当前线程的优先级

getPriority():获取线程的优先级

setPriority(int p):设置线程的优先级

注:高优先级的线程要抢占低优先级线程 cpu 的执行权。但是只是从概率上讲,高优先级的线程高概率被执行。并不意味着只有当高优先级的线程执行完以后,低优先级的线程才执行

myTest t = new myTest();
t.setPriority(9); //将优先级设置为9
t.start();
举报

相关推荐

0 条评论