首页 >后端开发 >java教程 > 正文

java是多线程的吗

原创2019-11-09 13:44:390754
phpStudy Linux 面板(小皮面板)
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("主线程...");
    }
}

运行结果:

java-1.jpg

实现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("主线程运行结束!");
    }
}

运行结果:

java-2.jpg

使用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-3.jpg

以上就是java是多线程的吗的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码
  • 相关标签:java
  • 本文原创发布php中文网,转载请注明出处,感谢您的尊重!
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • 专题推荐

    推荐视频教程
  • 马士兵JAVA坦克游戏视频教程马士兵JAVA坦克游戏视频教程
  • 尚学堂java开发聊天室视频教程尚学堂java开发聊天室视频教程
  • 魔乐科技java五子棋视频教程魔乐科技java五子棋视频教程
  • Java多线程与并发库高级应用视频教程Java多线程与并发库高级应用视频教程
  • 视频教程分类