java是多线程的,使用多线程有三种方法:继承Thread类、实现Runnable接口和使用Callable和Future创建线程。
继承Thread类 (推荐学习:java课程 )
实现方式很简单,只需要创建一个类去继承Thread类然后重写run方法,在main方法中调用该类实例对象的start方法即可实现多线程并发。代码:
public class MyThread extends Thread { @Override public void run(){ super.run(); System.out.println("执行子线程..."); } }
测试用例:
public class Test { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); System.out.println("主线程..."); } }
运行结果:
实现Runnable接口
这种方式的实现也很简单,就是把继承Thread类改为实现Runnable接口。代码如下:
public class MyRunnable implements Runnable { @Override public void run() { System.out.println("执行子线程..."); } }
测试用例:
public class Test { public static void main(String[] args) { Runnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); System.out.println("主线程运行结束!"); } }
运行结果:
使用Callable和Future创建线程
上面的两种方式都有这两个问题:
无法获取子线程的返回值
run方法不可以抛出异常
为了解决这两个问题,我们就需要用到Callable这个接口了。说到接口,上面的Runnable接口实现类实例是作为Thread类的构造函数的参数传入的,之后通过Thread的start执行run方法中的内容。但是Callable并不是Runnable的子接口,是个全新的接口,它的实例不能直接传入给Thread构造,所以需要另一个接口来转换一下。
以这里面其实就是要比上一个方法再多一个转换过程,最终一样是通过Thread的start来创建新线程。有了这个思路,代码就很容易理解了:
import java.util.concurrent.Callable; public class MyCallable implements Callable { int i = 0; @Override public Object call() throws Exception { System.out.println(Thread.currentThread().getName()+" i的值:"+ i); return i++; //call方法可以有返回值 } }
测试:
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class Test { public static void main(String[] args) { Callable callable = new MyCallable(); for (int i = 0; i < 10; i++) { FutureTask task = new FutureTask(callable); new Thread(task,"子线程"+ i).start(); try { //获取子线程的返回值 System.out.println("子线程返回值:"+task.get() + "\n"); } catch (Exception e) { e.printStackTrace(); } } } }
执行结果(部分):
以上是java是多线程的吗的详细内容。更多信息请关注PHP中文网其他相关文章!