java线程之Thread方法介绍

本篇内容介绍的是Java中Thread中的方法。Thread是创建线程的类,在Java中开启多线程一半都需要经过这个类,Thread开启线程必须要用的方法有两个。一个是run方法,该方法必须被子类重写,只有在该方法中的内容才认为是线程中的内容。另一个是start,该方法是启动线程的时候使用的,只有在调用start时才是启动线程。下面来介绍其他的方法:

join()方法

join方法是等待线程执行终止的方法。在多线程执行过程中,有些时候 需要等待某一条线程执行完毕再,向下进行执行。join方法就是用来做这么一件事情的。看下面代码:

public class ThreadTest {


    public static void main(String[] args) throws InterruptedException {
        //创建线程 1
        Thread thA=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程A开始执行");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程A执行完毕");

            }
        });
        //创建线程 2
        Thread thB=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程B开始执行");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程B执行完毕");

            }
        });


        //启动两个等待的线程 3
        thA.start();;
        thB.start();

        //4
        System.out.println("暂停,等待线程AB结束");


        //等待线程结束 5
        thA.join();
        thB.join();;
        //6
        System.out.println("主线程执行");

    }
}

1&2标记是分别创建了线程,并且在线程中调用了休眠的方法。
3启动线程
4是一个测试语句,我们可以看到在运行的时候4先输出,因为这个时候没有调用join的方法。运行期间会发现6语句总是在join结束后进行输出。
5join方法,用来等待线程执行结束的,在线程执行完毕后进行返回(注意join方法是没有返回值的)

运行结果:
在这里插入图片描述
在上面的代码中启动了两个线程,分别调用了两个线程的join方法。线程执行中会等待join方法执行完毕之后再去执行主线程的方法。

sleep()方法

sleep一个见名思意的方法,本义是睡眠,在线程中表示休眠。sleep是一个静态方法,在一个线程中调用sleep的方法后,该线程会让出指定时间的执行权,也就是在这个时间不参加cpu的调度。但是该线程所拥有的监视器资源,比如锁,还是不会让出的。指定时间结束后该线程会正常返回,线程处于就绪状态。然后参与CPU调度,就可以继续运行了。如果线程在运行期间调用了interruot()方法中断线程,那么会在sleep处中断线程,并抛出InerroutedException异常。
无关紧要的内容:我们知道在失眠的时候,属羊可以快速入睡。但是这是源自于国外,因为sleep(睡眠)和sheep(绵羊)音相近。在国内可以数水饺,应该是很有效的,数着数着你就会发现,其实宵夜是个很好的东西,并且饺子确实很好吃。
下面例子可以演示,线程在睡眠的时候不会让出监视器资源:

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class ThreadTest {
    //创建一个独占锁
    private static  final Lock lock=new ReentrantLock();


    public static void main(String[] args) {


        //创建线程
        Thread thA=new Thread(new Runnable() {
            @Override
            public void run() {
                //获取独占锁
                lock.lock();
                try{
                    System.out.println("线程A开始休眠");
                    Thread.sleep(1000);
                    System.out.println("线程A休眠结束");


                }catch (InterruptedException e){
                    e.printStackTrace();


                }finally {
                    //释放锁
                    lock.unlock();
                }


            }
        });
        //创建线程
        Thread thB=new Thread(new Runnable() {
            @Override
            public void run() {
                //获取独占锁
                lock.lock();
                try{
                    System.out.println("线程B开始休眠");
                    Thread.sleep(1000);
                    System.out.println("线程B休眠结束");


                }catch (InterruptedException e){
                    e.printStackTrace();


                }finally {
                    //释放锁
                    lock.unlock();
                }


            }
        });


        //启动两个等待的线程
        thA.start();;
        thB.start();


    }
}

运行结果:在这里插入图片描述
上面代码创建了一个Lock锁,这是一个独占锁,这里要注意解锁的时候必须放在finally中进行解锁。
上面的输出结果中可以看到,在A休眠的过程中B并没有获取到资源进行执行。而是在A执行结束后B才进行执行,这就说明sleep并没有释放锁资源。
注意:如果sleep(long millis)传递的是个负数,会抛出illegalArgumentException异常。

yield()方法

yield是Thread中的静态方法,线程调用yield()方法时表示暗示线程调度器当前线程请求让出自己的cpu使用。线程调度器可以无条件忽略这个请求。因为系统会为每个线程分配时间片来使用CPU,只有时间片耗尽之后,才会进入下一轮的调度。当线程调用yield方法的时候,表示时间片还没有用尽,剩下的不想使用了,暗示线程调度器进行下一次的调度。
当调用yeild方法时,线程会处于就绪状态。线程调度器会在就绪队列里面找到一个优先级最高的线程执行,很有可能会选到刚刚调用yeild方法的线程。一般很少使用yield方法。

sleep和yield的区别


sleep–线程调用sleep的时候,线程会被挂起制定的时间,在被挂起的时候该线程不会被再次调度。
yield–调用yield方法的时候,线程会让出自己剩余的时间片,线程处于就绪状态。线程调度器可能会再次调度该线程。

线程中断

线程中断是一种线程间的协作模式,设置线程中断并不能直接中断线程。而是被中断的线程根据中断状态自行处理。
void interrupt():中断线程。线程A运行时,线程B可以的调用线程A的interrupt()方法来设置线程A的中断标志为true并立即返回。设置标志仅仅是设置标志,这时候线程A并没有结束,而是继续向下执行。如果线程A遇到了wait系列函数、join方法或者sleep方法而被阻塞挂起,这时候线程B调用线程A的interrupt方法,线程A会抛出InterruptedException异常。
boolean isInterrupted():检测当前线程是否被中断,如果被中断返回true,否则返回false。
boolean interrupted(): 检测当前线程是否被中断,如果是返回true,否则返回false。该方法如果发现当前线程被中断,会清除中断标志。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值