Thread方法详解

1.thread.sleep方法
sleep方法使线程休眠,让cpu去执行其他线程。但是并不会释放锁(当前线程如果持有某个对象的锁,在sleep期间不会释放)
代码实例:
/**
 * @author cki
 * @since 1.0.0, 2017/11/07
 */
public class Test {
    private Object object = new Object();

    public static void main(String[] args) {
        Test versionController = new Test();
        MyThread test1 = versionController.new MyThread("张三");
        MyThread test2 = versionController.new MyThread("李四");
        test1.start();
        test2.start();
    }

    class MyThread extends Thread {

        private String name;

        public MyThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            synchronized (object) {
                try {
                    System.out.println("线程" + Thread.currentThread().getName() + "进入睡眠状态");
                    Thread.currentThread().sleep(10000);
                } catch (InterruptedException e) {

                }
                System.out.println("线程" + Thread.currentThread().getName() + "睡眠结束");
            }
        }
    }

}

运行结果:


从结果中可以看出,在线程thread-0 sleep期间,由于持有了object这个对象的锁,而且没有释放,导致thread-1线程必须等待他执行结束后才能访问object对象 


2.thread.yield方法
yield方法也会使当前线程释放cpu,让cpu去执行其他线程,也不会释放锁,与sleep不同的是,yield方法不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。
调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,也就是说调用该方法的线程会与其他线程再一起竞争cpu。
代码示例:
/**
 * @author cki
 * @since 1.0.0, 2017/11/07
 */
public class Test {
    private Object object = new Object();

    public static void main(String[] args) {
        Test versionController = new Test();
        MyThread test1 = versionController.new MyThread("张三");
        MyThread test2 = versionController.new MyThread("李四");
        test1.start();
        test2.start();
    }

    class MyThread extends Thread {

        private String name;

        public MyThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {

            for (int i = 0; i < 10; i++) {
                System.out.println(name + " " + i);
                if (i == 5) {
                    this.yield();
                }
            }
        }
    }

}

运行结果:


以上两种结果都是有可能的,因为线程1调用yield方法后,会与线程2一起竞争cpu,所以再执行哪个线程是不确定的。 


3.thread.join方法
join方法可以使一个线程等待另一个线程执行完再执行或者是等待另一个线程若干时间再执行。join方法可以加入参数,作为等待的时间,而不用等待线程执行完毕。
join()
join(long millis)     //参数为毫秒
join方法的底层实际上是调用了object的wait方法,而wait方法会释放对象锁,因此join方法也同理。

代码示例: 

/**
 * @author cki
 * @since 1.0.0, 2017/11/07
 */
public class Test {
    private Object object = new Object();

    public static void main(String[] args) {
        Test versionController = new Test();
        System.out.println("线程" + Thread.currentThread().getName() + "开始执行");
        MyThread test1 = versionController.new MyThread("张三");
        test1.start();
        try {
            test1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程" + Thread.currentThread().getName() + "结束执行");
    }

    class MyThread extends Thread {

        private String name;

        public MyThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            System.out.println("线程" + Thread.currentThread().getName() + "开始执行");
            try {
                this.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程" + Thread.currentThread().getName() + "结束执行");
        }
    }

}
当把test1.join()该行注释以后,执行结果如下: 

当执行test1.join()后,执行结果如下: 


可以看到,main线程会等待thread-0线程执行结束后再执行。 


4.thread.interrupt方法
interrupt方法,顾名思义就是中断线程,但是它只可以中断处于阻塞状态的线程,它会使处于阻塞状态的线程抛出InterruptedException异常,同时中断线程。
代码示例如下:

/**
 * @author cki
 * @since 1.0.0, 2017/11/07
 */
public class Test {
    private Object object = new Object();

    public static void main(String[] args) {
        Test versionController = new Test();
        MyThread test1 = versionController.new MyThread();
        test1.start();
        try {
            Thread.currentThread().sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        test1.interrupt();
    }

    class MyThread extends Thread {

        @Override
        public void run() {
            try {
                this.sleep(5000);
            } catch (InterruptedException e) {
                System.out.println("线程" + Thread.currentThread().getName() + "被中断");
            }
        }
    }

}
执行结果如下: 

可以看到thread-0线程在阻塞过程中抛出了InterruptedException异常。

另一个问题,thread.interrupt可以中断阻塞状态中的线程,那么正在运行中的线程是否可以中断呢,答案是不可以的,对于非阻塞状态的线程,调用interrupt方法仅仅是把中断标志位置为true,并不会抛出异常,因此也不能中断线程。如果需要中断非阻塞状态的线程,需要配合thread.isInterrupted()方法执行。thread.isInterrupted()用于判断中断标志位置是否为true。

代码实例如下:

/**
 * @author cki
 * @since 1.0.0, 2017/11/07
 */
public class Test {
    private Object object = new Object();

    public static void main(String[] args) {
        Test versionController = new Test();
        MyThread test1 = versionController.new MyThread();
        test1.start();
        try {
            Thread.currentThread().sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        test1.interrupt();
    }

    class MyThread extends Thread {

        @Override
        public void run() {
            int i = 0;
            do {
                System.out.println(i);
                i++;
            } while (i < Integer.MAX_VALUE && !Thread.currentThread().isInterrupted());
        }
    }

}

运行结果如下: 


可以看到,线程thread-1在执行若干时间后被test1.interrupt()方法和isInterrupted()方法配合执行后中断。

最后附上一张线程状态转换图:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Thread类是Java中用于创建和管理线程的类。它提供了一些方法来控制线程的行为。其中一些方法包括: 1. start()方法:用于启动线程并执行run()方法。通过继承Thread类并重写run()方法,可以在start()方法被调用时执行自定义的线程代码。 2. run()方法:是线程的主要执行方法。在run()方法中定义了线程要执行的任务。当start()方法被调用时,run()方法会被自动调用。 3. currentThread()方法:是Thread类的一个静态方法,用于返回当前正在执行的线程对象。它可以用来获取当前线程的信息,如线程名称等。 4. sleep()方法:用于使线程暂停执行一段时间。可以通过指定休眠时间来控制线程的执行速度。 5. join()方法:用于等待一个线程的结束。当一个线程调用另一个线程的join()方法时,它会暂停自己的执行,直到被调用的线程执行完毕。 6. interrupt()方法:用于中断一个线程的执行。当一个线程调用另一个线程的interrupt()方法时,被调用的线程会收到一个中断信号,可以根据需要做出相应的处理。 以上是Thread类的一些常用方法详解。通过使用这些方法,可以实现线程的创建、启动、暂停、等待和中断等功能。 #### 引用[.reference_title] - *1* *3* [JavaThread类的详解](https://blog.csdn.net/Beyondandzy/article/details/118824388)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Thread 类部分常用方法详解](https://blog.csdn.net/weixin_41685207/article/details/108877533)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值