大纲:

  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. 算法Sedgewick第四版-第1章基础-010一检查括号是否成对出现

    /****************************************************************************** * Compilation: javac ...

  2. Java-马士兵设计模式学习笔记-工厂模式-单例及多例

    一.单例的作用是用于控制类的生成方式,而不让外部类任意new对象 1.Car.java import java.util.ArrayList; import java.util.List; publi ...

  3. 断电操作导致的jboss项目部署失败------从早上九点一直到下午4点才解决

    虚拟机jboss可以连接成功,项目也可以正常编译成功.但是,去访问backstop网址的时候,就是,显示,无法访问该网站.访问9990的jboss服务器时,也是显示无法访问该网站. 项目代码是没问题的 ...

  4. [学习笔记]信号基本概念(中断和信号)/名称及常用信号/信号处理/signal函数实践

    1基本概念 中断 q  中断是系统对于异步事件的响应 q  中断信号 q  中断源 q  现场信息 q  中断处理程序 q  中断向量表 异步事件的响应:进程执行代码的过程中可以随时被打断,然后去执行 ...

  5. CIFAR-10 模型

    Code: https://github.com/tensorflow/models/tree/master/official/resnet Data: http://www.cs.toronto.e ...

  6. [译]Javascript中的循环

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  7. Oracle中的学习笔记

    1.使用 ||来连接字符串 select CARD_ID ||','||CARD_TYPE as qqq from CARDS t 2.DISTINCT (唯一不重复) select DISTINCT ...

  8. python---信用卡ATM

    一  需求 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还, ...

  9. B - EXCEL排序(sort+结构体)

    Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<=100000) 和 C,其中 N 是纪录的 ...

  10. java线程池的使用(转)

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...