四种多线程方式
Posted in-the-game-of-thrones
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四种多线程方式相关的知识,希望对你有一定的参考价值。
Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。
其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。
方式一:继承Thread类
重写run()方法,调用start()方法执行。
需要注意的是:为什么多线程的启动不是调用run()方法,而是调用start()方法?
在Java开发中有一门JNI(Java Native Interface)技术,这门技术的特点,使用Java调用本机操作系统的函数,但是这个技术不能离开特定的操作系统。
如果线程想要执行,需要操作系统分配资源。所以此操作严格来讲需要JVM根据不同的操作系统来实现的。
start()方法中,使用了native关键字修饰了方法,而native关键字时根据不同的操作系统分配不同的资源。
start()方法,不仅仅要启动多线程执行的代码,还需要根据不同的操作系统来分配资源
1 package test; 2 3 public class MyThread 4 public static void main(String[] args) 5 Test t1 = new Test("one"); 6 Test t2 = new Test("two"); 7 Test t3 = new Test("three"); 8 /** 9 * 调用Thread类中的start方法,才能进行多线程的操作,而不是run方法 10 * start()方法不仅仅启动多线程代码的执行,还需要根据不同的操作系统分配资源 11 */ 12 try //调用Thread类中的sleep方法,让线程等待指定的一段时间 13 Thread.sleep(1000); 14 catch (InterruptedException e) 15 e.printStackTrace(); 16 17 t1.start(); 18 t2.start(); 19 t3.start(); 20 21 22 23 /** 24 * 继承线程类Thread,重写run()方法,在run方法中实现需要进行的数据操作 25 * @author Administrator 26 * 27 */ 28 class Test extends Thread 29 30 private String name; 31 32 public Test(String name) 33 this.name=name; 34 35 @Override 36 public void run() //需要进行多进程的操作 37 for (int i = 0; i < 100; i++) 38 System.out.println(name+"===>"+i); 39 40 41
方式二:实现Runnable接口
实现run方法,将Runnable对象作为参数放入到Thread构造方法中,在调用start()方法。
1 package test; 2 /** 3 * 测试Runnable接口 4 * @author Administrator 5 * 6 */ 7 public class MyRunnable 8 public static void main(String[] args) 9 Demo mr1 = new Demo("A"); 10 Demo mr2 = new Demo("B"); 11 Demo mr3 = new Demo("C"); 12 //将该对象作为参数,传入到Thread类中,在调用start()方法。 13 new Thread(mr1).start(); 14 new Thread(mr2).start(); 15 new Thread(mr3).start(); 16 17 18 19 /** 20 * 实现Runnable接口,实现多线程 21 * @author Administrator 22 * 23 */ 24 class Demo implements Runnable 25 26 private String name; 27 28 public Demo(String name) 29 this.name = name; 30 31 32 @Override 33 public void run() 34 for (int i = 0; i < 300; i++) 35 System.out.println(name + "==>" + i); 36 37 38 39
方式三:实现Callable接口通过FutureTask包装器来创建Thread线程
待续。。。
方式四:使用ExecutorService、Callable、Future实现有返回结果的线程
待续。。。
以上是关于四种多线程方式的主要内容,如果未能解决你的问题,请参考以下文章