Thread,线程中的某些方法及用途

本文详细介绍了Java中的Thread.sleep()方法,包括它的作用、使用示例以及如何中断休眠。通过实例展示了如何在多线程环境中控制线程的休眠和唤醒,并探讨了如何合理地终止线程执行。同时,强调了在终止线程时避免强制停止,而是通过共享变量和条件检查来优雅地结束线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、static void sleep(long millis):

- 静态方法 ,参数是毫秒 ,

作用:让当前线程进入休眠,进入“阻塞状态”,放弃占有CPU时间片,让给其它线程使用。 * - Thread.sleep()方法  可以做到的效果:间隔特定的时间,去执行一段特定的代码,每隔特定的时间执行一次。

 //让当前线程进入休眠,睡眠5s
        /*try {
            Thread.sleep(1000*5);//让
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("hello world");
        */

        for (int i = 0; i < 10; i++) {

            //此段代码实现的效果就是,每输出一次,隔1S后再输出,直至循环结束

            System.out.println(Thread.currentThread().getName()+"---->"+i);

            try {//当前线程进入“阻塞状态”,睡眠1s
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

sleep()方法分面试题:

//在主线程中调用分支线程的sleep()方法,可以使分支线程休眠,进入阻塞状态吗?

public class ThreadTest7 {
    public static void main(String[] args) {
         //创建线程对象
        Thread mt3 = new MyThread3();
        //设置线程名
        mt3.setName("mt3");
        //启动线程
        mt3.start();

//问题答案:
        //调用sleep()
        //mt3.sleep(时间参数);此句代码运行时会转换成   Thread.sleep(时间参数);

        // 这句代码是错误的,因为sleep()方法只能用在线程中,
        // 即要想让mt3休眠,sleep()方法必须放在MyThread3中的run()方法内,才是有效的。
    }
}
class MyThread3 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"---->"+ i);
        }
    }
}

重点,怎样终止sleep()方法:

/*
* sleep()睡眠太久了,如果希望 半道上醒来,该怎么办?也就是怎么终止线程的休眠?
* */
public class ThreadTest8 {
    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable2());
        t.setName("t");
        t.start();
        //希望5s后,t线程醒来
        try {
            Thread.sleep(1000*5);//睡眠5s
            System.out.println("t线程执行");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //中断t线程的睡眠,这种终端睡眠的方式依靠了java的异常处理机制
        t.interrupt();
        //进行干扰, 使t线程中的Thread.sleep()方法出异常,进入catch部分,打印异常信息,
        // 结束后,整个try..catch部分结束,t线程正常往下运行。
    }
}
class MyRunnable2 implements Runnable{
    //重点:run()方法中的异常不能throws,只能try..catch
    // 因为run()方法在父类中没有抛出任何异常,子类不能比父类抛出更多的异常。
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"-----> begin");
        try {//这里只能try..catch,因为子类不能比父类抛出更多或者更宽泛的异常。
            Thread.sleep(1000*60*60*24*365);
        } catch (InterruptedException e) {
           // e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"-----> end");
    }
}

怎样强行终止一个线程:

/*
* 怎么合理的终止线程的执行:
*   合理使用if...else 和  return 语句 
* */
public class ThreadTest10 {
    public static void main(String[] args) {
        MyRunnable4 r = new MyRunnable4();
        Thread t = new Thread(r);
        t.setName("t");
        t.start();
        //模拟5s
        try {
            Thread.sleep(1000*5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //终止线程,修改属性run的值,让其直接跳转else,执行return即可。
        r.run = false;
    }
}
class MyRunnable4 implements Runnable{
    //布尔标记
    boolean run = true;

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if (run) {//run没有问题,再继续往下运行
                System.out.println(Thread.currentThread().getName()+"----->"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else {
                //想保存数据之类的操作,可以在return之前执行,
                // 因为return语句的执行才是真正的终止线程
                //终止线程
                return;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值