/** * 对监视线程的抽象。封装一种特殊的线程行为:一旦被创建就永远循环地做某件事情, * 直到该线程被杀死。这是一个抽象类,从Thread类继承而来,不能直接实例化,其子类 需要覆盖方法task()来完成具体的功能。 * * @version 1.0 */ public abstract class WatchThread extends Thread { /** 该线程存活标志,kill()方法将该标志置为false。 */ private boolean alive = true; /** 当前线程状态信息。用于告知外界该线程正在做什么。 */ private String status = null; /** 该类的所有子类对象均创建到这个线程组中。 */ public static final ThreadGroup tg = new ThreadGroup("watch-thread"); /** * 构造函数,提供一个线程名参数。构造方法只创建线程,并不启动。 * * @param name * 线程的名字,为线程起个好名字对调试和日志记录很有帮助。 */ public WatchThread(String name) { super(tg, name); setDaemon(true); // 设置成精灵线程(程序在只剩下精灵线程运行时将自动结束) } /** * 杀死该线程的方法,将alive标志置为false,当run()方法的while循环发现该标志为 * false时将跳出循环结束线程。需注意的是kill()方法返回时并不一定线程立即死掉。 要等到线程主体从一次task()方法返回后才会结束。 */ public void kill() { alive = false; } /** * 线程主体,循环运行task()方法,直到调用了kill()方法。 */ /** * public void run() { * * //无论出现什么异常都不能使该线程终止! while (alive) { try { task(); } catch (Exception ex) * { ex.printStackTrace(); } catch (Throwable t) { //出现严重错误,搞不好系统会死掉 * t.printStackTrace(); } } } **/ public void run() { // 无论出现什么异常都不能使该线程终止! while (alive) { try { task(); } catch (Exception ex) { ex.printStackTrace(); } catch (Throwable t) { // 出现严重错误,搞不好系统会死掉 t.printStackTrace(); } } } /** * 设置状态信息。用来告诉外界该线程正在干什么。 * * @param state * 新的状态信息。 */ protected void setStatus(String newStatus) { this.status = newStatus; } /** * 获取状态信息。告诉外界该线程正在干什么。 * * @return 状态信息。 */ public String getStatus() { return this.status; } /** * 子类必须覆盖的抽象方法,需要循环做的事情。 */ abstract protected void task(); }
相关推荐
这意味着线程B可以得到CPU时间片并执行其任务,而线程A则一直保持运行状态,因为它被设计成无限循环。 然而,这种情况并不意味着线程A会独占CPU资源。实际上,操作系统会通过时间片轮转的方式分配CPU给各个线程,...
总之,IBM的jca467.jar是WAS环境下进行Java线程分析的强大工具,它能够帮助开发者深入洞察应用程序的内部运行情况,有效地定位和解决多线程问题,提升系统的稳定性和性能。通过熟练掌握并运用这个工具,开发者可以在...
活锁则是指线程不断重试获取资源,但由于其他线程持有资源不释放,导致线程陷入无限循环的状态。避免死锁和活锁的关键在于合理设计资源获取顺序和超时策略。 3.1 死锁的四个必要条件 - 互斥条件:线程对所占有的...
Java提供了`Thread`类和`Runnable`接口来创建和管理线程。当一个线程运行时间过长,我们需要一种机制来中断它,这就是超时控制的目的。 超时控制通常可以通过两种方式实现:使用Future和Callable接口,或者使用中断...
例如,在示例代码中,如果`t1`线程在执行`suspend()`之后,`t2`线程开始执行并修改了共享变量`shareVar`,然后`t1`被`resume()`唤醒,`t1`可能会陷入一个无限循环,因为它在`suspend()`时检查的条件(`shareVar==5`...
这个Java线程专题学习资料可能包含了上述知识点的详细讲解,尤其是从JavaEye社区收集的经典教程,将帮助开发者深入理解Java线程的使用和优化,提升并发编程能力。通过学习和实践,你可以掌握如何在多线程环境中编写...
首先,我们看到一个未同步的`run()`方法,当`b`为`false`时,这个线程会无限循环地调用`sell()`方法。此时,如果多个线程同时执行,可能会导致卖出的票数超过实际的票数,因为没有进行同步控制。 然后,我们看到一...
这个线程通常在一个无限循环中运行,以确保游戏的连续性。每当循环迭代时,它会检查游戏的当前状态,并做出相应的更新。 2. 用户输入处理线程:这个线程用于接收用户的键盘输入,比如方向键的按下,然后将这些输入...
- 活锁:线程不断尝试获取资源但始终失败,导致线程无限循环。 10. **线程安全** - 临界区:只允许一个线程访问的代码段。 - 同步容器类:如`Vector`, `HashTable`等,提供了线程安全的容器操作。 - 并发容器类...
线程内部可能包含一个无限循环,不断读取客户端发送的数据,并根据数据内容做出响应。例如,可能会解析客户端的查询请求,查询数据库并返回结果。在处理完一次请求后,线程并不会立即终止,而是等待新的数据到来,以...
- **避免无限循环:** 无限循环会导致线程无法正常退出,应使用条件退出循环。 - **使用并发集合:** `java.util.concurrent`包提供了专门用于多线程环境的集合类。 #### 七、总结 通过本教程的学习,你已经掌握了...
- `go()`方法: 包含了一个无限循环,用于更新计数器的值并显示在文本框中。 - `sleep(100)`: 让线程暂停一段时间,避免过度消耗CPU资源。 - `runFlag`: 一个布尔变量,用于控制计数器是否继续递增。 - **用户...
在服务端,通常首先创建一个ServerSocket实例,然后在一个无限循环中调用`accept()`方法监听客户端的连接。每当接收到一个连接,就在新的线程中处理这个连接: ```java ServerSocket serverSocket = new ...
在Java编程中,线程是程序执行的基本单元,它允许应用程序同时执行多个任务。了解如何查看线程的运行状态对于调试和性能优化...通过阅读和分析源码,我们可以更深入地了解Java线程的工作原理,从而提升我们的编程技能。
- **活锁**:线程反复尝试获取资源但总是失败,导致无限循环。 通过理解并掌握以上知识点,开发者能够编写出高效、稳定的多线程Java程序,解决并发问题,提高程序性能。在实际项目中,合理地使用线程和同步机制是...
同时,`main`线程也处于无限循环中,持续打印其线程名称和状态。 在`TestThread`类中,我们继承了`Thread`类并重写了`run()`方法。这个方法将在新线程启动后执行,同样处于一个无限循环中,持续输出该线程的名称和...
在文档中,无论是MyThread还是MyRunable类的run()方法中,都存在一个无限循环,这可能造成线程永远无法结束。为了控制线程在特定条件下能够优雅地结束,可以使用共享变量配合volatile关键字进行控制,或者使用中断...
在本聊天程序中,服务器端开启一个`ServerSocket`,然后在一个无限循环中调用`accept()`方法,等待新的客户端连接。当有新的客户端连接时,服务器会为每个客户端创建一个新的线程来处理通信,确保不会因为处理一个...
Java线程是Java编程中的重要概念,它允许程序并发执行多个任务,提高系统资源的利用率,为多核处理器环境提供良好的支持。...了解并熟练掌握这些Java线程知识,能够帮助开发者编写出高效、稳定、安全的多线程程序。