多线程编程的实战技巧主要包括线程操纵资源类、避免虚假唤醒、使用锁和条件变量等工具。以下是一个具体的例子: 1. 定义一个资源类Source,包含一个锁lock、三个条件变量conditionA、conditionB、conditionC和一个状态变量state。 ```java class Source { Lock lock = new ReentrantLock(); Condition conditionA = lock.newCondition(); Condition conditionB = lock.newCondition(); Condition conditionC = lock.newCondition(); int state = 1; void printA() { System.out.println("A"); } void printB() { System.out.println("B"); } void printC() { System.out.println("C"); } } ``` 2. 定义三个线程类A、B、C,每个线程都包含一个Source对象,并实现run方法。在run方法中,线程首先获取锁,然后判断状态是否等于自己的序号,如果不是,则等待。如果是,则执行打印操作,并将状态设置为下一个线程的序号,最后通知下一个线程。 ```java class A implements Runnable { private Source source; public A(Source source) { this.source = source; } @Override public void run() { source.lock.lock(); try { while (source.state != 1) { source.conditionA.await(); } source.printA(); source.state = 2; source.conditionB.signal(); } catch (Exception e) { e.printStackTrace(); } finally { source.lock.unlock(); } } } ``` 3. 在主函数中,创建Source对象和三个线程,并启动线程。 ```java class Test { public static void main(String[] args) throws InterruptedException { Source source = new Source(); for (int i = 0; i < 100; i++) { new Thread(new A(source)).start(); new Thread(new B(source)).start(); new Thread(new C(
点赞 评论

相关推荐

简答题1.&nbsp;在java中,那种数据类型可以存储一个汉字2.&nbsp;我们有一个类A,然后创建它的子类B,最后创建一个B类的对象b。那么b&nbsp;instanceof&nbsp;A的返回值是什么?3.&nbsp;哪种访问修饰符能让类中的成员变量对所有的类可见?4.&nbsp;Java中使用什么关键字声明一个抽象方法?5.&nbsp;下述代码输出是什么?String&nbsp;a&nbsp;=&nbsp;new&nbsp;String(&amp;quot;abc&amp;quot;);&nbsp;String&nbsp;b&nbsp;=&nbsp;new&nbsp;String(&amp;quot;abc&amp;quot;);&nbsp;System.out.println(a&nbsp;==&nbsp;b);6.&nbsp;Java的垃圾收集器可以回收什么类型的内存?7.&nbsp;在Java中,下列哪个选项不会导致NullPointerException?()88.&nbsp;java&nbsp;SE&nbsp;8&nbsp;引入了一个新的日期和时间API,哪个类是这个api的主要入口?9.假设&nbsp;List&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList&lt;&gt;()&nbsp;哪种方式可以有效地从列表中删除元素(假设已知元素的索引或对象本身)?10.&nbsp;在java程序中,main方法的参数String[]&nbsp;args代表了什么?11.&nbsp;在java中,数组有多少个有效方法?12.&nbsp;在java中,String&nbsp;API使用哪一种编程范式?13.&nbsp;想要改变引用对象的值,传入的引用对象应该声明什么关键字?14.&nbsp;hashSet在java中的时间复杂度是多少?15.&nbsp;ExecutorService&nbsp;的submit()方法和execute方法有什么区别?16.&nbsp;在集合框架中使用的二分查找算法是什么时间复杂度?17.&nbsp;用什么可以防止反射破解单例模式?18.&nbsp;如果reentranLock处于公平锁状态,下面哪种情况将被优先获取锁?&nbsp;&nbsp;&nbsp;&nbsp;A.&nbsp;子线程的唤醒&nbsp;&nbsp;&nbsp;&nbsp;B.&nbsp;正在等待的线程&nbsp;&nbsp;&nbsp;&nbsp;C.&nbsp;主线程的唤醒&nbsp;&nbsp;&nbsp;&nbsp;D.&nbsp;线程池中的线程19.&nbsp;对于一个空创建的LinkedHashMap,下面哪个描述是正确的?&nbsp;&nbsp;&nbsp;&nbsp;A.&nbsp;表头是最近很少使用的元素&nbsp;&nbsp;&nbsp;&nbsp;B.&nbsp;表尾是最近使用的元素&nbsp;&nbsp;&nbsp;&nbsp;C.&nbsp;表头是插入顺序的第一个元素&nbsp;&nbsp;&nbsp;&nbsp;D.&nbsp;根据key的哈希值排序算法题1.&nbsp;找出数组中任何一个重复的元素并返回,而且只要找出一个,不用找出所有重复出现过的元素。返回值是int2.&nbsp;合并排序后的链表
查看19道真题和解析
点赞 评论 收藏
分享
牛客网
牛客企业服务