多线程编程面试题

it2023-07-16  68

冲击大厂必备

面试题

Java并发——两个线程交替打印两个数组中的元素 | 多个线程按顺序输出数字 有两个字符数组

number = {‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’}letter = {‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,‘G’,‘H’,‘I’}

要求启动2个线程,交替打印其中元素,输出结果为 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 H 9 I

第一种实现方法,使用wait()、notify方法实现

public static void main(String[] args) { char[] arr1 = {'1','2','3','4','5','6','7','8','9'}; char[] arr2 = {'A','B','C','D','E','F','G','H','I'}; Object o = new Object(); new Thread(()->{ synchronized(o){ for(char c : arr1){ System.out.print(c); try { o.notify(); o.wait(); }catch (Exception e){ } } } }).start(); new Thread(()->{ synchronized(o){ for(char c : arr2){ System.out.print(c); try { o.notify(); o.wait(); }catch (Exception e){ } } } }).start(); }

第二种实现方法 park、onpark方法

需要注意的是:以下这种写法仅用作展示原理。实际会报错,因为匿名内部类中的变量需要用final修饰,例如LockSupport.unpark(t2); t2需要用final修饰。二final变量又是不可能更改的。所以会报错。

实际做的方法是:定义两个类,继承Thread,并分别重写run方法。来实现这个过程。

public static void main(String[] args) { final Thread t1 = null; final Thread t2 = null; char[] number = {'1','2','3','4','5','6','7','8','9'}; char[] letter = {'A','B','C','D','E','F','G','H','I'}; //这里会报错,final修饰的变量不可以更改。 t1 = new Thread(() ->{ for(char num : number){ System.out.print(num + " "); LockSupport.unpark(t2); //唤醒t2线程 LockSupport.park(); //将本线程阻塞 } }); //这里会报错,final修饰的变量不可以更改。 t2 = new Thread(() ->{ for(char let : letter){ LockSupport.park(); //防止t2线程先执行从而先输出A System.out.print(let + " "); LockSupport.unpark(t1); //唤醒t1线程 } }); t1.start(); t2.start(); }
最新回复(0)