• 技术文章 >Java >Java入门

    java多线程的创建及启动

    VV2020-04-15 16:16:33转载856

    Java中线程的创建常见有如三种基本形式:

    一、继承Thread类,重写该类的run()方法

    继承Thread类,重写该类的run()方法

    public class MyThread extends Thread{
        @Override
        public void run() {
            for (int i = 0 ;i < 50;i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
        public static void main(String[] args) {
            for (int i = 0;i<50;i++) {
                //调用Thread类的currentThread()方法获取当前线程
                System.out.println(Thread.currentThread().getName() + " " + i);
                if (i == 10) {
                    new MyThread().start();
                    new MyThread().start(); 
                }
            }
        }
    }

    运行结果:

    ...
    main 48
    main 49
    Thread-0:0
    Thread-0:1
    Thread-0:2
    Thread-0:3
    Thread-0:4
    Thread-1:0
    ...

    从结果中可以看出:

    1、有三个线程:main、Thread-0 、Thread-1;

    2、Thread-0 、Thread-1两个线程输出的成员变量 i 的值不连续(这里的 i 是实例变量而不是局部变量)。因为:通过继承Thread类实现多线程时,每个线程的创建都要创建不同的子类对象,导致Thread-0 、Thread-1两个线程不能共享成员变量 i ;

    3、线程的执行是抢占式,并没有说Thread-0 或者Thread-1一直占用CPU(这也与线程优先级有关,这里Thread-0 、Thread-1线程优先级相同,关于线程优先级的知识这里不做展开)

    (学习视频推荐:java视频教程

    二、通过实现Runnable接口创建线程类

    定义一个类实现Runnable接口;创建该类的实例对象obj;将obj作为构造器参数传入Thread类实例对象,这个对象才是真正的线程对象。

    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            for (int i = 0 ;i < 50 ;i++) {
                System.out.println(Thread.currentThread().getName()+":" +i);
            }
        }
    
        public static void main(String[] args) {
           for (int i = 0;i < 50;i++) {
                System.out.println(Thread.currentThread().getName() + ":" +i);
                if (i == 10) {
                    MyRunnable myRunnable = new MyRunnable();
                    new Thread(myRunnable).start();
                    new Thread(myRunnable).start();
                }
            }
            //java8 labdam方式
             new Thread(() -> {
                System.out.println(Thread.currentThread().getName());
            },"线程3").start();
        }
    }

    运行结果:

    ...
    main:46
    main:47
    main:48
    main:49
    Thread-0:28
    Thread-0:29
    Thread-0:30
    Thread-1:30
    ...

    1、线程1和线程2输出的成员变量i是连续的,也就是说通过这种方式创建线程,可以使多线程共享线程类的实例变量,因为这里的多个线程都使用了同一个target实例变量。但是,当你使用上述的代码运行的时候,你会发现,其实结果有些并不连续,这是因为多个线程访问同一资源时,如果资源没有加锁,那么会出现线程安全问题;

    2、java8 可以使用lambda方式创建多线程。

    三、通过Callable和Future接口创建线程

    创建Callable接口实现类,并实现call()方法,该方法将作为线程执行体,且该方法有返回值,再创建Callable实现类的实例;使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值;使用FutureTask对象作为Thread对象的target创建并启动新线程;调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

    public class MyCallable implements Callable<Integer> {
        private int i = 0;
        @Override
        public Integer call() throws Exception {
            int sum = 0;
            for (; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i);
                sum += i;
            }
            return sum;
        }
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            // 创建MyCallable对象
            Callable<Integer> myCallable = new MyCallable();
            //使用FutureTask来包装MyCallable对象
            FutureTask<Integer> ft = new FutureTask<Integer>(myCallable);
            for (int i = 0;i<50;i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
                if (i == 30) {
                    Thread thread = new Thread(ft);
                    thread.start();
                }
            }
            System.out.println("主线程for循环执行完毕..");
            Integer integer = ft.get();
            System.out.println("sum = "+ integer);
        }
    }

    call()方法的返回值类型与创建FutureTask对象时<>里的类型一致。

    相关教程推荐:java快速入门

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

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:java 多线程
    上一篇:java实现输出数组中的最小值的方法 下一篇:使用java将一个二维数组顺时针输出
    大前端线上培训班

    相关文章推荐

    • java返回乱码怎么办• java的游戏有哪些• java程序怎么写• java 找不到jar怎么办

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网