• 技术文章 >Java >java教程

    java是多线程的吗

    (*-*)浩(*-*)浩2019-11-09 13:44:39原创1617
    java是多线程的,使用多线程有三种方法:继承Thread类、实现Runnable接口和使用Callable和Future创建线程。

    php入门到就业线上直播课:进入学习

    继承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中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:java
    上一篇:java显示1秒前,1分钟前,2分钟前,3天前 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• Java中的快速排序• Java8新特性的lambda,函数式接口,StreamingAPI• java 猜拳小游戏• Java Eclipse进行断点调试
    1/1

    PHP中文网