ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

头歌实践教学平台:Java高级特性-多线程基础(2)常用函数(三下)

头歌实践教学平台:Java高级特性-多线程基础(2)常用函数(三下) 第3关常用函数二纸上得来终觉浅欲知此事须躬行我们还是通过实例来学习这些函数的用法。问题建立两个线程A线程打印5次AB线程打印5次B要求线程同时运行交替打印5次AB。这个问题用Object的wait()notify()就可以很方便的解决。代码如下public class MyThread implements Runnable {private String name;private Object prev;private Object self;private MyThread(String name, Object prev, Object self) {this.name name;this.prev prev;this.self self;}public void run() {int count 5;while (count 0) {synchronized (prev) {synchronized (self) {System.out.print(name);count--;self.notify();}try {prev.wait();} catch (InterruptedException e) {e.printStackT\frace();}}}System.exit(0);//退出jvm}public static void main(String[] args) throws Exception {Object a new Object();Object b new Object();MyThread ta new MyThread(A, b, a);MyThread tb new MyThread(B, a, b);new Thread(ta).start();Thread.sleep(100); //确保按顺序A、B执行new Thread(tb).start();Thread.sleep(100);}}运行程序结果为ABABABABAB线程常用函数总结下表列出的是线程类常用的函数函数 描述public void start() 使该线程开始执行Java 虚拟机调用该线程的 run 方法。public void run() 如果该线程是使用独立的 Runnable 运行对象构造的则调用该 Runnable 对象的 run 方法否则该方法不执行任何操作并返回。public final void setName(String name) 改变线程名称使之与参数 name 相同。public final void setPriority(int priority) 更改线程的优先级。public final void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。public final void join(long millisec) 等待该线程终止的时间最长为 millis 毫秒public void interrupt() 中断线程。public final boolean isAlive() 测试线程是否处于活动状态。public static void yield() 暂停当前正在执行的线程对象并执行其他线程。public static void sleep(long millisec) 在指定的毫秒数内让当前正在执行的线程休眠暂停执行此操作受到系统计时器和调度程序精度和准确性的影响。public static boolean holdsLock(Object x) 当且仅当当前线程在指定的对象上保持监视器锁时才返回 true。public static Thread currentThread() 返回对当前正在执行的线程对象的引用。public static void dumpStack() 将当前线程的堆栈跟踪打印至标准错误流。编程要求请仔细阅读右侧代码根据方法内的提示在Begin - End区域内进行代码补充具体任务如下建立三个线程A线程打印5次EB线程打印5次DC线程打印5次U要求线程同时运行交替打印5次EDU。测试说明补充完代码后点击测评平台会对你编写的代码进行测试当你的结果与预期输出一致时即为通过。开始你的任务吧祝你成功package step3;public class MyThread implements Runnable {private String name; // 线程名称(E/D/U)private Object prev; // 前一个线程的锁private Object self; // 当前线程的锁private static final int COUNT 5; // 每个线程打印次数public MyThread(String name, Object prev, Object self) {this.name name;this.prev prev;this.self self;}Overridepublic void run() {int count COUNT;while (count 0) {synchronized (prev) { // 先获取前一个线程的锁synchronized (self) { // 再获取当前线程的锁System.out.print(name); // 打印字符count--;self.notify(); // 唤醒等待在self锁上的线程}try {if (count 0) // 最后一次打印后无需等待prev.wait(); // 释放prev锁并等待唤醒} catch (InterruptedException e) {e.printStackTrace();}}}// 最后一个线程打印完毕后唤醒所有等待线程以确保程序退出synchronized (self) {self.notify();}}public static void main(String[] args) throws Exception {Object e new Object();Object d new Object();Object u new Object();Thread threadE new Thread(new MyThread(E, u, e));Thread threadD new Thread(new MyThread(D, e, d));Thread threadU new Thread(new MyThread(U, d, u));// 启动顺序E - D - UthreadE.start();Thread.sleep(100); // 确保E先启动threadD.start();Thread.sleep(100); // 确保D接着启动threadU.start();// 等待所有线程执行完毕threadE.join();threadD.join();threadU.join();}}有任何问题都可以随时关注私信
返回列表