JAVA多线程
一,介绍
Java多线程是指在Java程序中同时执行多个线程的机制。多线程可以提高程序的并发性和响应性,使得程序能够同时执行多个任务或处理多个请求。
在Java中,多线程可以通过以下几种方式实现:
- 继承Thread类:创建一个类继承自Thread类,并重写其run()方法来定义线程的执行逻辑。通过创建Thread类的实例并调用start()方法,可以启动一个新的线程并执行其run()方法中的代码。
class MyThread extends Thread { public void run() { // 线程执行逻辑 } } // 创建并启动线程 MyThread thread = new MyThread(); thread.start();
- 实现Runnable接口:创建一个类实现Runnable接口,并实现其run()方法来定义线程的执行逻辑。通过创建Thread类的实例,将实现了Runnable接口的对象作为参数传递,并调用start()方法,可以启动一个新的线程并执行其run()方法中的代码。
class MyRunnable implements Runnable { public void run() { // 线程执行逻辑 } } // 创建并启动线程 MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start();
- 使用Executor框架:Java提供了Executor框架来管理和调度线程池中的线程。通过创建ExecutorService对象并提交Runnable或Callable任务,可以实现线程的执行和管理。
ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池 executor.submit(new MyRunnable()); // 提交Runnable任务 executor.shutdown(); // 关闭线程池
- 使用Callable和Future:Callable接口类似于Runnable接口,但它可以返回一个结果,并且可以抛出异常。通过创建Callable对象并使用ExecutorService的submit()方法提交任务,可以获得一个Future对象,通过该对象可以获取Callable的返回值或取消任务的执行。
class MyCallable implements Callable<Integer> { public Integer call() throws Exception { // 线程执行逻辑 return 42; // 返回结果 } } ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(new MyCallable()); Integer result = future.get(); // 获取结果 executor.shutdown();
Java多线程的优势在于可以充分利用多核处理器的性能,提高程序的并发能力。但在多线程编程中需要注意线程安全性、共享资源的同步和互斥访问、死锁等问题,需要使用合适的同步机制(如synchronized、Lock)和线程间的通信方式(如wait/notify、Condition)来保证程序的正确性和可靠性。
二,start和run方法的区别
我有一次和别人聊天,聊到以前同事说以前去面试过一次就是问的这个问题我把这个问题给说反了,接下来我来重点介绍一下这个问题
在Java中,多线程可以通过继承Thread类或实现Runnable接口来实现。不论使用哪种方式,都需要调用start()方法来启动线程,并且start()方法会自动调用线程的run()方法。以下是start()和run()方法的区别:
1. start()方法:
- start()方法用于启动一个新线程,并使其进入就绪状态(可运行状态)。当调用start()方法时,实际上是告诉JVM启动一个新线程,在新线程中调用run()方法。
- 启动线程后,start()方法会立即返回,不会阻塞当前线程的执行。
- 在一个线程对象上只能调用一次start()方法,多次调用会抛出IllegalThreadStateException异常。
2. run()方法:
- run()方法是线程的执行体,包含了线程要执行的代码逻辑。当线程启动后,会自动调用run()方法来执行线程代码。
- 直接调用run()方法并不会启动一个新线程,而是在当前线程中按顺序执行run()方法里的代码,没有实现多线程的效果。
- 当run()方法执行完成后,线程将自动结束。
总结:
- start()方法用于启动一个新线程并执行线程代码,具备多线程的效果。
- run()方法是线程的执行体,仅在当前线程中按顺序执行,没有实现多线程的效果。
实际应用中,我们通常使用start()方法来启动线程,因为它能够充分利用多核处理器的并行性,实现真正的多线程操作。而直接调用run()方法一般用于测试或特殊需求的场景。
简单来说就是run方法还是调用当前的线程而start是在执行过程中new run 方法了