java多线程---创建线程的几种方式

创建线程的几种方式

  在并发编程中,创建线程是我们经常会做的事情,那么一般来说,创建线程有4种方式:

  1、继承Thread类。

  2、实现Runnable接口。

  3、实现Callable接口,结合FutureTask来使用。

  4、利用线程池的方式来实现。

继承Thread创建线程

public class ThreadTest1 extends Thread {
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("ThreadTest1 is running");
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadTest1 threadTest1=new ThreadTest1();
        threadTest1.start();
        System.out.println("第一次:"+System.currentTimeMillis());
        Thread.sleep(1000);
        threadTest1.run();
        System.out.println("第二次:"+System.currentTimeMillis());
    }
}
执行结果为:

第一次:1569155515336
ThreadTest1 is running
ThreadTest1 is running
第二次:1569155517338

  由上述例子可以看出,调用threadTest1.start()的时候先执行的输出时间然后执行的线程中的输出语句,而调用threadTest1.run()方法先执行的是ThreadTest1中的run()方法后执行主线程中的输出实际的语句,所以可以得出,直接调用run()方法不是启动线程的方式,而是直接调用线程中的run()方法和线程无关,启动线程的方式是调用Thread.start()方法。

实现Runnable接口创建线程

public class ThreadTest2 implements Runnable {
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread is running");
    }

    public static void main(String[] args) {
        ThreadTest2 threadTest2=new ThreadTest2();
        Thread thread=new Thread(threadTest2);
        thread.start();
        System.out.println(System.currentTimeMillis());
    }
}

  实现接口Runnable来创建线程也是一种实现方式,与继承Thread类创建线程的不同在于,一个是继承、一个是实现接口,由于JAVA不允许多继承,所以在实际项目中实现Runnable接口来创建线程的方式还是用的比较多的。

实现Callable接口

public class ThreadTest3 implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int i = 0;
        for (; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
        System.out.println(Thread.currentThread().getName() + " " + i);
        return i;
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadTest3 threadTest3 = new ThreadTest3();
        //很重要,无论多少个线程调用futureTask,futureTask只会执行一次
        FutureTask<Integer> futureTask = new FutureTask<Integer>(threadTest3);
        Thread thread1 = new Thread(futureTask, "aa");
        Thread thread2 = new Thread(futureTask, "bb");
        Thread thread3 = new Thread(futureTask, "cc");
        thread1.start();
        Thread.sleep(3000);
        thread2.start();
        Thread.sleep(3000);
        thread3.start();
        try {
            System.out.println("最终结果为" + futureTask.get());
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

  实现Callable接口最重要的就是可以得到线程执行的返回值,但是实现Callable接口的类需要配合FutureTask来使用,同时我们注意到上面的例子很重要的一点,就是无论多少个线程来执行futuretask最终只会有一个线程执行,所以这种方法在并发变成中会很安全,不用担心多个线程调用了使得结果不正确。

使用线程池来创建线程

public class ThreadMain {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
       ExecutorService executorService= Executors.newFixedThreadPool(3);
        Callable<Integer> callable=new ThreadTest3();
        Future f=executorService.submit(callable);
        System.out.println("最终结果为" + f.get());
        executorService.shutdown();

        ExecutorService executorService2=Executors.newFixedThreadPool(3);
        Thread thread=new ThreadTest1();
        executorService2.execute(thread);
        executorService2.shutdown();
    }
}

  使用线程池来创建线程主要依靠的是Executors中的静态方法来创建线程池,实际上该种方法来创建线程本质还是上面3种方式,只不过在实际运用中使用多线程来执行任务用的比较多。

原文地址:https://www.cnblogs.com/rhodesis/p/11569178.html

时间: 2024-08-07 00:02:46

java多线程---创建线程的几种方式的相关文章

Java多线程——创建线程的两种方式

创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程的任务run方法执行. 可以通过Thread的getName获取线程的名称 Thread-编号(从0开始)主线程的名字就是main. 例: class Demo extends Thread { private String name; Demo(String name) { super(name)

Java中创建线程的两种方式

1.定义实现Runnable接口的线程类,步骤如下: (1)创建实现了Runnable接口的线程类Runner: (2)重写Runnable接口的run()方法,用于定义线程的运行体:(Runnable接口只有这一个方法) (3)实例化线程类Runner: (4)创建线程实例,并将线程类Runner的实例传递给它作为构造函数的参数: (5)启动线程: 代码如下所示: 1 public class TestThread { 2 public static void main(String args

Java并发编程-创建线程的两种方式及区别

转载请注明:http://blog.csdn.net/UniKylin/article/details/45016117 1.线程和进程的区别 并行:是多个任务在同一时间同时执行,例如多核计算机同时计算的任务可以理解为并行 并发:从微观上看是多个任务抢占一个CPU从而执行自己的任务,轮流执行任务,但是如果遇到资源冲突的时候并没有从根本提高执行效率.但是提高了CPU的使用效率. 前段时间在GitHub上的一幅图可以很好的阐述上面的概念非常形象 2.Java中创建线程的两种方式 1.第一种方式:直接

黑马程序员——创建线程的两种方式

java中创建线程有两种方式: 1.继承Thread类 步骤: (1)定义一个类继承Thread类 (2)复写Thread类中的run()方法 (3)调用start()方法:启动线程及调用run()方法 2.实现Runnable接口的方式 步骤:(1)定义一个类实现Runnable接口 (2)覆盖Runnable接口中的run()方法,将线程要运行的代码放到该run方法中 (3)通过Thread类建立线程对象 (4)将实现Runable接口的类对象作为实际参数传递给Thread的构造函数. (5

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方

java创建线程的三种方式及其对照

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法.run方法的方

【java并发】传统线程技术中创建线程的两种方式

传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式大部分人可能都知道,但是为什么这样玩就可以呢?下面我们来详细分析一下这两种方法的来龙去脉. 1. 揭秘Thread中run()方法 上面我们看到这两种方式都跟run()方法有关,所以我们来看一下Thread的源码中run()方法到底都干了什么: @Override public void run()

Java创建线程的第二种方式:实现runable接口

/*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法    将线程要运行的代码存放在该run方法中 3.通过Thread类建立线程对象4.将Runable接口的子类对象作为实际参数传递给Thread类的构造函数  为什么要将Runable接口的子类对象传递给Thread的构造函数.  因为,自定义的run方法所属的对象是Runable接口的子类对象  所以要让线程去指定对象的Run

创建线程的两种方式比较Thread VS Runnable

1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 1 public class MyThread extends Thread{ 2 @Override 3 public void run() { 4 // TODO Auto-generated method stub 5 6 } 7 } 8 //线程使用 9 MyThread mt = new MyThread(); //创建线程 10 mt.start(); //启动线程 另外一种方式是实现Runnabl