多线程的常用操作方法

本文详细介绍了Java中多线程的常用操作,包括线程命名、休眠Thread.sleep()、让步Thread.yield()、插队join()、sleep、yield和wait的区别、线程停止的几种方式,以及线程通信和调度策略。重点讨论了线程休眠、让步、插队的具体实现和它们之间的差异,以及如何安全地停止线程。
摘要由CSDN通过智能技术生成

一、线程命名与取得

多线程的运行状态是不确定的,所以对于多线程操作必须有一个明确标识出线程对象的信息,这个信息往往通过名称来描述。在 Thread 类中提供有如下的线程名称方法:

No 方法名 类型 功能
1 public Thread(Runnable targrt,String name) 构造方法 创建线程的时候设置名称
2 public final synchronized void setName(String name) 普通方法 设置线程名称
3 public final String getName() 普通方法 取得线程名称
4 public static native Thread currentThread() 本地方法 取得线程对象
class MyThread implements Runnable {
   
    private int ticket = 10;

    @Override
    public void run() {
   
        while (this.ticket > 0) {
   
            System.out.println("当前线程:" + Thread.currentThread().getName() + " ,剩余票数:" + this.ticket--);
        }
    }
}

public class Test {
   
    public static void main(String[] args) {
   
        MyThread mt = new MyThread();
        new Thread(mt).start();
        new Thread(mt).start();
        new Thread(mt, "线程A").start();
    }
}

在这里插入图片描述
如果没有设置线程名称,则会自动分配一个线程名字,从0开始。

二、线程休眠Thread.sleep()----单位(ms)

让线程暂缓执行一下,等到了预计时间之后再恢复执行。

  • 线程休眠会立即交出CPU,让CPU去执行其他任务
  • 线程休眠不会释放对象锁
class MyThread implements Runnable {
   

    @Override
    public void run() {
   
        for (int i = 0; i < 100; i++) {
   
            try {
   
                Thread.sleep(1000);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
            System.out.println("当前线程:" + Thread.currentThread().getName() + " ,i = " + i);
        }
    }
}

public class Test {
   
    public static void main(String[] args) {
   
        MyThread mt = new MyThread();
        new Thread(mt).start();
        new Thread(mt).start();
        new Thread(mt).start();
    }
}

通过代码观察会错误的认为这三个线程是同时休眠的,但是千万要记住,所有的线程是依次进入到run()方法中的。真正进入到run方法的对象可能是多个,也可能是一个。进入代码的顺序可能有差异,但是总体的执行是并发执行。

三、线程让步Thread.yield()

暂停当前正在执行的线程对象,并执行其他线程。

  • yield( )会让当前线程交出CPU,但不一定立即交出
  • yield不能控制具体的交出CPU的时间
  • yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会
  • yield( )不会释放对象锁
  • 调用 yield 方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,所以,执行yield( )方法的线程有可能在进入到就绪状态后马上又被执行了
class MyThread implements Runnable {
   

    @Override
    public void run() {
   
        for (int i = 0; i < 3; i++) {
   
            Thread.yield();
            System.out.println("当前线程:" + Thread.currentThread().getName() + ",i=" + i);
        }
    }

}

public class Test {
   

    public static void main(String[] args) {
   
        MyThread mt = new MyThread();
        new Thread(mt).start();
        new Thread(mt).start();
        new Thread(mt).start();
    }
}

四、线程插队join()

在线程a中调用线程b的join,此时线程a就进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态

  • join()方法只是对Object类的wait()方法做了一层包装而已。

4.1案例1

class MyThread implements Runnable {
   

    @Override
    public void run() {
   
        try {
   
            System.out.println("Begin ThreadImpl");
            Thread.sleep(5000);
            System.out.println("End ThreadImpl");
        } catch (InterruptedException e
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值