问题历史:
Java自始至终支持多线程。线程允许并行执行多个任务,充分利用多核处理器。JVM提供了对操作系统线程的抽象层。
问题:
创建、管理和结束线程需要清晰理解它们的生命周期、同步和可能的竞争状态。不当使用线程可能导致死锁、对资源的错误访问和复杂的错误日志。
解决方案:
在Java中,可以通过扩展Thread类或实现Runnable接口,或使用现代工具如ExecutorService来创建线程。正确结束线程、管理它们的生命周期和同步访问共享数据是非常重要的。
创建和结束线程的示例:
class MyRunnable implements Runnable { public void run() { System.out.println("线程正在运行"); } } public class ThreadExample { public static void main(String[] args) { Thread t = new Thread(new MyRunnable()); t.start(); // 启动线程 try { t.join(); // 等待结束 } catch (InterruptedException e) { e.printStackTrace(); } } }
关键特性:
start()方法启动线程,而不是run()(否则不会真正并行)join()IllegalThreadStateException结束后能否重新启动线程?
不能。线程在结束后被视为“死”,再次调用start()会导致IllegalThreadStateException。
调用t.run()和t.start()有什么区别?
t.run()只是在线程中执行run方法,而不创建新的执行线程。只有t.start()创建了一个单独的操作系统线程。
如果线程因未处理的异常结束,会发生什么?
如果抛出未处理的异常,线程将异常终止,其堆栈跟踪将输出到错误流,而其他线程不受影响。
run()而不是start()InterruptedException)程序员通过run()方法启动线程,以为它与main并行运行,但实际上所有操作都是顺序执行的。
优点:
缺点:
正确使用start()、适当处理异常、使用join()等待线程结束。
优点:
缺点: