线程基础一

什么是线程?
线程:就是进程中一个负责程序执行的控制单元(执行路径)
一个进程中可以多执行路径,称之为多线程。
一个进程中至少要有一个线程。
开启多个线程是为了同时运行多部分代码。
每一个线程都有自己运行的内容,这个内容可以称之为线程要执行的任务
多线程解决什么问题?

可以使多部分代码  '同时' 进行,提高运行效率和速度


如何实现一个线程?

方式一:继承Thread类,在类中定义一个run()方法,执行的任务或者代码
就放在run()方法中,其实Thread实现了Runnable接口。
测试类:
方式二:
    直接实现Runnable接口,创建类对象,作为参数放入Thread的实例化对象中。
注意:实现接口方式,一般是在类继承了别的类无法继承Thread类时使用的,当然也可以
直接使用。
测试类:

方式三(参考别的大神的):

实现Callable接口通过FutureTask包装器来创建Thread线程

Callable接口(也只有一个方法)定义如下:


方式四(也是参考别的大神的):

ExecutorService、Callable、Future三个接口实际上都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,有了这种特征就不需要再为了得到返回值而大费周折了。而且自己实现了也可能漏洞百出。

可返回值的任务必须实现Callable接口。类似的,无返回值的任务必须实现Runnable接口。

执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了。

注意:get方法是阻塞的,即:线程无返回结果,get方法会一直等待。

再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。

import java.util.concurrent.*
import java.util.Date; 
import java.util.List; 
import java.util.ArrayList; 
 
/**
* 有返回值的线程
*/ 
@SuppressWarnings(
"unchecked"
public class Test { 
public static void main(String[] args) throws ExecutionException, 
    InterruptedException { 
   System.out.println(
"----程序开始运行----"); 
   Date date1
= new Date(); 
 
  
int taskSize = 5
  
// 创建一个线程池 
   ExecutorService pool =
Executors.newFixedThreadPool(taskSize); 
  
// 创建多个有返回值的任务 
   List<Future> list =
new ArrayList<Future>(); 
  
for (int i = 0; i < taskSize; i++) { 
    Callable c
= new MyCallable(i + " "); 
   
// 执行任务并获取Future对象 
    Future f =
pool.submit(c); 
   
// System.out.println(">>>" + f.get().toString()); 
    list.add(f); 
   } 
  
// 关闭线程池 
   pool.shutdown(); 
 
  
// 获取所有并发任务的运行结果 
  
for (Future f : list) { 
   
// 从Future对象上获取任务的返回值,并输出到控制台 
    System.out.println(">>>" +
f.get().toString()); 
   } 
 
   Date date2
= new Date(); 
   System.out.println(
"----程序结束运行----,程序运行时间【" 
     + (date2.getTime() - date1.getTime()) + "毫秒】"
); 


 
class MyCallable implements Callable<Object>
private String taskNum; 
 
MyCallable(String taskNum) { 
  
this.taskNum = taskNum; 

 
public Object call() throws Exception { 
   System.out.println(
">>>" + taskNum + "任务启动"); 
   Date dateTmp1
= new Date(); 
   Thread.sleep(
1000); 
   Date dateTmp2
= new Date(); 
  
long time = dateTmp2.getTime() - dateTmp1.getTime(); 
   System.out.println(
">>>" + taskNum + "任务终止"); 
  
return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】"















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值