java多线程-创建线程
大纲:
- Thread创建线程。
- Runnable接口。
- Callable接口。
- 小结
一、java创建线程--继承Thead类
创建一个类继承Thead类,并重写run方法。
class Test {
public static void main(String[] args) {
System.out.println("当前线程:"+Thread.currentThread());
new TestThread().start();
new TestThread().start();
}
static class TestThread extends Thread {
@Override
public void run() {
System.out.println("当前线程:"+Thread.currentThread());
}
}
}
/**
运行结果:
当前线程:Thread[main,5,main]
当前线程:Thread[Thread-0,5,main]
当前线程:Thread[Thread-1,5,main]
*/
二、java创建线程--实现Runnable接口
创建一个类实现Runnable接口,并重写run方法。
class Test {
public static void main(String[] args) {
System.out.println("当前线程:"+Thread.currentThread());
new Thread(new TestThread()).start();
new Thread(new TestThread()).start();
}
static class TestThread implements Runnable {
@Override
public void run() {
System.out.println("当前线程:"+Thread.currentThread());
}
}
}
/**
运行结果:
当前线程:Thread[main,5,main]
当前线程:Thread[Thread-0,5,main]
当前线程:Thread[Thread-1,5,main]
*/
三、java创建线程--实现Callable接口
Callable接口中只有一个call方法,任务写在call方法中,与Runnable不同的是,任务执行完成后Callable返回执行结果,也可以抛出任务执行时的异常。
public interface Callable<V> {
V call() throws Exception;
}
Futrue接口共5个方法
- cancel取消任务,参数表示是否中断正在执行的任务。(1)任务没有开始或正在执行,返回true 。(2)任务执行完成,返回false。
- isCancelled:任务非正常执行完成,执行了cancel方法返回true。
- isDone:任务正常执行完成或任务执行了cancel都返回true。
- get:方法阻塞至任务执行完毕,返回执行结果,当任务执行报错时可以通过任务中抛出的ExecutionException拿到异常信息。
- 带参get:可以设置超时时间,任务执行超时,抛出TImeoutException。
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}
RunnableFuture接口实现了Runnable和Future接口
public interface RunnableFuture<V> extends Runnable, Future<V> {
void run();
}
RunnableFuture接口有一个实现类FutureTask,FutureTask的构造函数接收一个Callable任务,又继承了Future接口,因此执行FutureTask任务可以拿到执行结果。
public class TestCallable {
public static void main(String[] args) {
System.out.println("start");
//执行任务
FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep();
return "success";
}
});
new Thread(task).start();
//接收线程运算后的结果
try {
long start = System.currentTimeMillis();
System.out.println("任务执行结果:" + task.get());//get为阻塞方法,阻塞至任务执行结束
long end = System.currentTimeMillis();
long process = end - start;
System.out.println("任务执行了:" + process + "毫秒");
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println("end");
}
}
/**
运行结果:
start
任务执行结果:success
任务执行了:1018毫秒
end
*/
小结:
- Thread类中start方法首先为线程的执行准备好系统资源,然后再去调用run方法,因此run方法不需要我们手动调用。
- Thread和Runnable方式执行任务都无法在主线程中获取任务的执行结果,Callable执行任务可以获取执行结果,执行结果通过Future的get方法获取。
- Thread和Runnable方式执行任务都无法在主线程中获取任务执行的异常信息,Callable执行任务可以通过Future中的get方法抛出异常。
- 这些执行的任务的线程都是被主线程创建出来的子线程。
java多线程-创建线程的更多相关文章
- Java 多线程 - 创建线程的方法 + Executors.newXXXThreadPool()缺点
java中创建线程的三种方法以及区别: https://www.cnblogs.com/3s540/p/7172146.html 通过Executor 的工具类,创建三种类型的普通线程池: https ...
- Java多线程——创建线程的两种方式
创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程 ...
- Java 多线程 创建线程的4种方式
1 继承Thread类,重写run方法.Thread类实现了Runnable接口. 2 实现Runnable接口,重写run方法.相比于继承Thread类,可以避免单继承的缺陷和实现资源共享. 举例: ...
- Java多线程-----创建线程的几种方式
1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体 创建Thread子类的实例,也就是创建 ...
- java多线程 -- 创建线程的第三者方式 实现Callable接口
Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- Java值创建线程的两种方式对比
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...
- Java多线程之线程其他类
Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...
- Java多线程之线程的通信
Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些 ...
随机推荐
- PCL—点云分割(超体聚类) 低层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/5013968.html 1.超体聚类——一种来自图像的分割方法 超体(supervoxel)是一种集合,集合的元素是 ...
- Mongo client - cross-platform MongoDB management tool
Mongo client for Ubuntu or Windows http://robomongo.org/download.html
- R: 关于 ggplot2 的初探
生活还很长,别急,慢慢来.亲爱的 require(ggplot2)p1 <- ggplot(mpg, aes(displ, hwy)) + geom_point() ; p1p1 + scale ...
- Luogu 3193 [HNOI2008]GT考试
BZOJ1009 妙! 推荐这篇题解: https://www.luogu.org/blog/Edgration/solution-p3193 考虑设计dp,设$f_{i, j}$表示长串匹配到i,短 ...
- Entity Framework Tutorial Basics(19):Change Tracking
Change Tracking in Entity Framework: Here, you will learn how entity framework tracks changes on ent ...
- 数据结构_bubble_sort
问题描述 给定一个 1~N 的排列 P,即 1 到 N 中的每个数在 P 都只出现一次. 现在要对排列 P 进行冒泡排序,代码如下:for (int i = 1; i <= N; ++i)for ...
- DNS线路
文章介绍 填写DNS地址时候,比较好记的就114.114.114.114,8.8.8.8,9.9.9.9,几个,但是常用的有哪些呢?这篇文章就简单介绍下了. 前言 两年多前,曾发帖对国内主流公共 DN ...
- wpf跳转网页
如果是本地磁盘上的网页,可以考虑利用操作系统的文件关联自动调用操作系统默认浏览器: System.Diagnostics.Process.Start("explorer.exe", ...
- [转]Passing Managed Structures With Strings To Unmanaged Code Part 2
1. Introduction. 1.1 In part 1 of this series of blogs we studied how to pass a managed structure (w ...
- linux 定制
转载至http://luyafei.blog.51cto.com/1092421/1131532 测试环境: VMware Workstation 8.0 CentOS 6.7 x86_64 1.安装 ...