大纲:

  1. Thread创建线程。
  2. Runnable接口。
  3. Callable接口。
  4. 小结

一、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个方法

  1. cancel取消任务,参数表示是否中断正在执行的任务。(1)任务没有开始或正在执行,返回true 。(2)任务执行完成,返回false。
  2. isCancelled:任务非正常执行完成,执行了cancel方法返回true。
  3. isDone:任务正常执行完成或任务执行了cancel都返回true。
  4. get:方法阻塞至任务执行完毕,返回执行结果,当任务执行报错时可以通过任务中抛出的ExecutionException拿到异常信息。
  5. 带参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
*/

小结:

  1. Thread类中start方法首先为线程的执行准备好系统资源,然后再去调用run方法,因此run方法不需要我们手动调用。
  2. Thread和Runnable方式执行任务都无法在主线程中获取任务的执行结果,Callable执行任务可以获取执行结果,执行结果通过Future的get方法获取。
  3. Thread和Runnable方式执行任务都无法在主线程中获取任务执行的异常信息,Callable执行任务可以通过Future中的get方法抛出异常。
  4. 这些执行的任务的线程都是被主线程创建出来的子线程。

java多线程-创建线程的更多相关文章

  1. Java 多线程 - 创建线程的方法 + Executors.newXXXThreadPool()缺点

    java中创建线程的三种方法以及区别: https://www.cnblogs.com/3s540/p/7172146.html 通过Executor 的工具类,创建三种类型的普通线程池: https ...

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

    创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程 ...

  3. Java 多线程 创建线程的4种方式

    1 继承Thread类,重写run方法.Thread类实现了Runnable接口. 2 实现Runnable接口,重写run方法.相比于继承Thread类,可以避免单继承的缺陷和实现资源共享. 举例: ...

  4. Java多线程-----创建线程的几种方式

       1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体 创建Thread子类的实例,也就是创建 ...

  5. java多线程 -- 创建线程的第三者方式 实现Callable接口

    Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个 ...

  6. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  7. Java值创建线程的两种方式对比

    在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...

  8. Java多线程之线程其他类

    Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...

  9. Java多线程之线程的通信

    Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些 ...

随机推荐

  1. Linux如何修改网络环境参数

    如下设置: 检验是否可以连通,就使用ping命令ping 网关开始的时候总是现实unreachable 设置IP:sudo ifconfig eth0 133.133.133.190 netmask ...

  2. R: 基本的数学运算

    ################################################### 问题:基本数学运算   18.4.30 R语言用于初等数学的计算,都怎么表示??加减乘除.余数. ...

  3. ENCODE:DNA 分子元件的百科全书

    ENCODE(DNA分子元件的百科全书)是由国家人类基因研究所(NHGRI)资助的一个国际研究联盟, 该联盟的目标是:建立一份综合的人类基因组功能元件的清单,这些基本元件包括那些直接作用蛋白质和RNA ...

  4. 形式化验证工具(PAT)羊车门代码学习

    首先介绍一下PAT工具,下图是PAT工具的图标 PAT工具全称是Process Analysis Toolkit,可以做一些简单的验证. 今天我们分析一下例子里面的Monty Hall Problem ...

  5. Netty服务端的业务流程分析

    Netty的服务端怎么和java NIO联系起来的,一直很好奇这块内容,这里跟下代码,下篇文章看下Channel相关的知识. finalChannelFuture initAndRegister(){ ...

  6. (数组)字符串的回文构词法( anagrams)

    题目:https://www.nowcoder.com/practice/e84e273b31e74427b2a977cbfe60eaf4?tpId=46&tqId=29130&tPa ...

  7. 1、Tomcat7性能监控与优化

    1.   目的 通过优化tomcat提高网站的并发能力. 2.   服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有决定性影响. 3.   优化配置 3.1. 配置tomcat管理员账户 ...

  8. C# 快速排序--二分查找法--拉格朗日插值法

    1.快速排序  参考自: https://www.cnblogs.com/yundan/p/4022056.html namespace 快速排序算法 { class Program { static ...

  9. CSS之引入样式

    CSS引入样式 内部样式 内嵌式是将CSS代码集中写在HTML文档的head头部标签中,并且用style标签定义,其基本语法格式如下: <head> <style type=&quo ...

  10. P1987 摇钱树

    题意:有n棵摇钱树,k天,每天可砍一棵并获得其金币    每棵树初始有$a_i$个金币,每天减少$b_i$个 问k天得到的最多金币数 这题很明显是DP(锻炼自己的机会来了QAQ) 设$f[i][j]$ ...