多线程系列三-线程常用方法

  1. 获取当前线程 :currentThread()

该方法返回执行currentThread()这个方法当前线程的信息(返回的是Thread实例)。

使用这个方法可以获取线程的名称等;
下面来看一下比较复杂的例子:

public class ThreadMethodTest {

    private static class MyThread extends  Thread{
        public MyThread(){
            System.out.println("MyThread-start");
            System.out.println("Thread.currentThread().getName():"+Thread.currentThread().getName());
            System.out.println("This.getName():"+this.getName());
            System.out.println("MyThread-end");
        }
        @Override
        public void run() {
            System.out.println("run-start");
            System.out.println("Thread.currentThread().getName():"+Thread.currentThread().getName());
            System.out.println("This.getName():"+this.getName());
            System.out.println("run-end");
        }
    }
    public  static void main(String[] args){
        MyThread myThread=new MyThread();
        myThread.setName("Mythread");
        myThread.start();

        System.out.println("main");
    }
}

输出结果:

MyThread-start
Thread.currentThread().getName():main   //这个时候线程还没创建,所以还是main线程执行
This.getName():Thread-0 //这里获取的这个类默认的名字
MyThread-end
run-start
Thread.currentThread().getName():Mythread
This.getName():Mythread
run-end
main
  1. 线程启动:start()和run()

调用run()不会启动线程
调用start()才会启动一个线程。

  1. iaAlive() 判断线程是否处于存活状态:
public class ThreadTest {
    private static class MyThread extends  Thread{
        @Override
        public void run() {
            System.out.println("MyThread" +isAlive());//结果:true
        }
    }
    public  static void main(String[] args) throws InterruptedException {
        MyThread myThread=new MyThread();
        myThread.start();
        Thread.sleep(2000);//暂停2s以便让线程执行完
        System.out.println("MyThread isAlive()"+myThread.isAlive());//结果false

    }
}
  1. sleep方法
    让线程休眠(单位毫秒)
    和Object方法wait区别():
    • Thread.sleep和Object.wait都会暂停当前的线程
    • sleep是Thread类的方法,wait是Object类中定义的方法
    • Thread.sleep不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.sleep不会让线程释放锁
    • 让线程状态不一样:

sleep 让线程从 【running】 -> 【阻塞态】 时间结束/interrupt -> 【runnable】

wait 让线程从 【running】 -> 【等待队列】notify -> 【锁池】 -> 【runnable】

  1. getId()方法
    取得线程唯一标识

6.线程停止stop()和interrupt()
stop停止线程是不安全的 ,目前已被弃用。
目前一般使用interrupt方法。但是这个方法不会停止正在运行的线程。Thread.interrupt()方法不会中断一个正在运行的线程。它实现上是在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

  1. 暂停线程:resume和suspend

暂停正在运行的方法线程。

他们都是独占的方式占用公共对象,会是的其他线程无法访问公共同步对象。

  1. yield 方法和join方法
    Yeild方法
    • 原理:放弃当前的CPU资源,让其他任务去占用cpu时间执行。
    • 场景:在某些情况下,如果子线程里要进行大量的耗时的运算,主线程可能会在子线程执行完之前结束,但是如果主线程又需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()。
    • 注:yield不会保证线程依次执行

join
- 与yield相反,这个方法阻塞调用此方法的线程(calling thread),直到线程t完成,此线程再继续;通常用于在main()主线程内,等待其它线程完成再结束main()主线程。例如:
- 假设有A、B两个线程,通常是在A线程中调用B线程变量的join方法,表示让A先执行完,再执行B。
9. setPriority 设置线程优先级。

  • java中线程优先级是1-10,超过了就会报异常。
  • 优先级具有随机性:优先级较高的线程不一定每次都先执行完。
  • 优先级具有继承性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值