学习 | 多线程顺序打印ABC

tech2022-09-05  103

前言

深夜睡不着,更新一波,突然想起了两个月之前的一次面试的懊悔。为什么懊悔呢,因为面试官出的题很简单很简单,但是我想太多了,导致出糗了。

过程

题目,有三个线程,按顺序打印123。

public class Test1 extends Thread{ public static void main(String[] args) throws InterruptedException { Thread a=new Thread(new Runnable() { @Override public void run() { System.out.println("1"); } }); Thread b=new Thread(new Runnable() { @Override public void run() { System.out.println("2"); } }); Thread c=new Thread(new Runnable() { @Override public void run() { System.out.println("3"); } }); //按顺序打印123 } }

可能是看了太多面试题,拿到题目第一时间想到了用synchronized,lock来锁住,然后一个一个释放,然后因为紧张,方法都写错了花了很长时间。后面面试官笑了笑说:“我也没说一定要启动线程呀!”。我瞬间恍然大悟,也为自己想太多而感到困窘。

解答

面试官说的不启动线程方法 方法一,直接使用run()方法,按顺序打印。

a.run(); b.run(); c.run();

面试结束后,整理出来三个方法

方法二,使用sleep()暂停线程,确保按顺序打印

a.start(); Thread.sleep(100); b.start(); Thread.sleep(100); c.start();

方法三,使用Thread类的封装方法setPriority(),设置优先级 (ps:正常时候按优先级开启线程,但是网上有人说有时候会因为cpu调度而不按优先级,但是我测试还没见过,有待考察)

a.setPriority(3); a.start(); b.setPriority(2); b.start(); c.setPriority(1); c.start();

方法四,使用join(),是开启下一个线程是进行验证

package com.jhuo; public class Test2 { public static void main(String[] args) { // 线程A final Thread a = new Thread(new Runnable() { @Override public void run() { System.out.println("A"); } }); // 线程B final Thread b = new Thread(new Runnable() { @Override public void run() { try { // 执行b线程之前,加入a线程,让a线程执行 a.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("B"); } }); // 线程C final Thread c = new Thread(new Runnable() { @Override public void run() { try { // 执行c线程之前,加入b线程,让b线程执行 b.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("C"); } }); // 线程D Thread d = new Thread(new Runnable() { @Override public void run() { try { // 执行d线程之前,加入c线程,让c线程执行 c.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("D"); } }); //方法四 a.start(); b.start(); c.start(); d.start(); } }

总结

这道题其实不需要用到synchronized和lock,加锁通常是用在多个线程并发使用同一个资源导致线程不安全,虽然理论上也可以加锁,释放,开启下一个线程,但是这样意义不大,而且效率会降低。这个面试题是我的第一次面试,虽然没有过,不知道是不是这道题的原因,但是确实提醒了我不能只注重开发,还要巩固基础和原理,才能在程序员这条道路上越走越远。

最新回复(0)