码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA-多线程-创建线程的三种方式

时间:2020-04-25 23:18:46      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:start   main   dex   roc   string   vat   轻量级   out   解决   

JAVA-多线程-创建线程的三种方式


  • 并发:同一时间只有一条指令在执行,多个进程的指令被快速轮换执行。
  • 并行:同一时间有多条指令在多个处理器上运行。
  • 进程:每个运行中的程序就是一个进程。
  • 线程:线程(Thread)也被称为轻量级进程(Lightweight Process),线程是进程的执行单元,在程序中是独立、并发的执行流。

多线程不会提高程序运行速度,但是会提高运行效率。


创建和使用线程的三种方式

继承Thread类创建的线程类

Thread类构造方法摘要

Thread()   // 分配新的 Thread 对象。
Thread(String name)  // 分配新的 Thread 对象。
Thread(Runnable target) // 分配新的 Thread 对象。
Thread(Runnable target, String name)    //分配新的 Thread 对象。

Thread类方法摘要

currentThread() // 返回对当前正在执行的线程对象的引用。
getName()   // 返回该线程的名称。
run()   // 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
setName(String name)    // 改变线程名称,使之与参数 name 相同。
start() //使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
sleep(long millis)  //在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

通用的获取线程名称方法:Thread.currentThread().getName();

创建过程

  • 创建Thread子类,重写run()方法,run()方法称为线程的执行体。
  • 实例化Thread子类。
  • 实例调用start()方法开启线程。

代码

// Thread子类
public class MyThread extends Thread{
	public MyThread() {
		super();
	}
	public MyThread(String name) {
		super(name);
	}
	// Override描述线程任务
	public void run() {
		for (int i = 0;i < 100;i ++) {
			System.out.println(Thread.currentThread().getName() + i);
		}
	}	
}
// 主线程
public static void main(String[] args) {
	// 创建线程对象
	MyThread mt = new MyThread("main");
	// 开启线程
	mt.start();
}

实现Runnable接口创建线程

使用Runnable接口的好处

Runnable接口的实现类只需要做一件事,那就是重写run()方法。好处是:

  • 解决了单纯使用Thread类耦合性过强的问题
  • run()方法可以返回值
  • Thread类可以只用来启动线程

创建过程

  • 定义Runnable接口的实现类,重写run()方法。
  • 将Runnable的实现类的实例作为Thread的target实例化Thread类。
  • 使用Thread的实例启动线程。

代码

// Runnable实现类
public class MyRunnable implements Runnable{
    // 重写run()方法
	public void run() {
		for (int i = 0;i<100;i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}
}
// 主线程
public static void main(String[] args) {
	// 创建线程任务对象
	MyRunnable mr = new MyRunnable();
	// 创建线程对象并明确线程任务
	Thread th = new Thread(mr);
	// 启动线程
	th.start();
	// 描述主线程的任务
	for (int i=0;i<100;i++) {
		System.out.println(Thread.currentThread().getName() + ":" + i);
		
	}
}

使用线程池创建线程

在JDK1.5前的程序员将多个线程封装到ArrayList集合中,用这种方式来进行简化创建线程的操作。在JDK1.5后java添加了线程池的功能。

方法和类

  • Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。
  • ExecutorService:线程池类
    Future submit(Callable task):获取线程池中的某一个线程对象,并执行线程中的call()方法
  • Future接口:用来记录线程任务执行完毕后产生的结果。

创建过程

  • 创建线程池对象
  • 创建Callable接口子类对象
  • 提交Callable接口子类对象
  • 关闭线程池

代码

// Callable实现类
public class TestCallable implements Callable<Integer>{
	private int num;
	// 重写call()
	public Integer call() throws Exception {
		int sum = 0;
		for (int i = 0;i <= 10;i ++) {
			sum += i;
		}
		return sum;
	}
	public TestCallable(int num) {
		super();
		this.num = num;
	}

}
// 主线程
public static void main(String[] args) {
	// 实例化线程池
	ExecutorService es = Executors.newFixedThreadPool(3);
	// 实例化Callable类
	TestCallable tc = new TestCallable(10);
	// 使用地址池实例创建线程并使用Future实例接收
	Future<Integer> f = es.submit(tc);

	try {
		// 输出结果
		System.out.println(f.get());
	} catch (InterruptedException | ExecutionException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

最后

所有的类的实例化完全可以使用匿名类进行处理,这样会让代码更简洁,也不会占用过多资源。

JAVA-多线程-创建线程的三种方式

标签:start   main   dex   roc   string   vat   轻量级   out   解决   

原文地址:https://www.cnblogs.com/torain/p/12775844.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!