一、线程&多线程

线程:

线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程 自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是 它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

多线程:

多线程指在单个程序中可以同时运行多个不同的线程执行不同的任务。

多线程编程的目的,就是“最大限度地利用 cpu 资源”,当某一线程的处理不需要占用 cpu 而只和 io 等资源 打交道时,让需要占用 Cpu 的其他线程有其他机会获得 cpu 资源。从根本上说,这就是多线程编程的最终 目的。

二、线程实现的方式

  • Thread
  • Runnable
  • Callable

Thread:

继承Thread类并重写run方法。其实Thread是实现Runnable接口来实现线程,class Thread implements Runnable {

public class Test {
public static void main(String[] args) {
Thread01 thread01 = new Thread01();
thread01.start();
}
}
class Thread01 extends Thread {
@Override
public void run() {
System.out.println("线程01执行了。。。");
}
}

Runnable:

实现Runnable并实现run方法,将Runnable放入到Thread中start即可。

public class Test {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable01());
thread.start();
}
} class Runnable01 implements Runnable{
public void run() {
System.out.println("Runnable01 running....");
}
}

第一种方法通过覆盖Thread中的run方法来实现线程,第二种方法中,通过源码可以发现,Thread中run方法的代码为:

public void run() {
if (target != null) {
target.run();
}
}

传入的Runnable就是target,所以当我们执行Thread.start()的时候,其实是执行的Runnable的run方法。

Callable:

实现Callable重写call方法,实现Callable和实现Runnable类似,但是功能更强大,具体表现在:

  1. 可以在任务结束后提供一个返回值,Runnable不行
  2. call方法可以抛出异常,Runnable的run方法不行
  3. 可以通过运行Callable得到的Fulture对象监听目标线程调用call方法的结果,得到返回值,(fulture.get(),调用后会阻塞,直到获取到返回值)
public class Test {
public static void main(String[] args) throws Exception {
System.out.println("main的线程:" + Thread.currentThread().getName());
Callable01 callable01 = new Callable01();
FutureTask<Integer> ft = new FutureTask<Integer>(callable01);
Thread thread = new Thread(ft);
thread.start();
System.out.println(ft.get()); //获得线程执行返回结果
}
}
class Callable01 implements Callable<Integer> {
public Integer call() throws Exception {
System.out.println("Callable01的线程:" + Thread.currentThread().getName());
return 111;
}
}

将Fulture放入Thread,能想到Fulture应该也实现了Runnable接口:

Java线程及其实现方式的更多相关文章

  1. Java线程的创建方式三:Callable(四)

    一.Java实现多线程的三种方式 方式一:继承Thread类: public class Test extends Thread { public static void main(String[] ...

  2. Java线程同步的方式

     java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),      将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的 ...

  3. java 线程传参 方式

    第一类:主动向线程传参   public class ThreadTest extends Thread { public ThreadTest() { } /** * 第一种通过构造方法来传递参数 ...

  4. Java线程的启动与中止

    一.线程与进程的关系 关于进程与线程,百度百科上是这样描述的: 进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 在当 ...

  5. Java 线程间通讯(共享变量方式)

    Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题. 一.没考虑线程同步: package com.wyf; publi ...

  6. Java线程间通信-回调的实现方式

    Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互.   比如举一个简单例子,有一个多线程的 ...

  7. Java线程的三种方式

    创建线程有三种方式: 1.继承Thread类 2.实现Runnable接口 3.使用Callable和Future创建线程 三种方式详解如下: ---------------------------- ...

  8. java线程实现的四种方式

    java多线程的实现可以通过以下四种方式 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法 3.通过Callable和FutureTask创建线程 4.通过线程池创 ...

  9. [转载]Java线程的两种实现方式

    转载:http://baijiahao.baidu.com/s?id=1602265641578157555&wfr=spider&for=pc 前言 线程是程序的一条执行线索,执行路 ...

随机推荐

  1. JS基础入门篇(十八)—日期对象

    1.日期对象 日期对象: 通过new Date()就能创建一个日期对象,这个对象中有当前系统时间的所有详细信息. 以下代码可以获取当前时间: <script> var t = new Da ...

  2. 集成google翻译的小tips

    文章首发于github.io 2018-08-04 12:43:20 google翻译的强大,就像我们公司的slogan : "让语言无国界,让世人心相通" 友情提示: googl ...

  3. Python-Pyquery库的安装和调用

    解析库pyquery:# pip安装pyquery库pip3 install pyquery from pyquery import PyQuery as pq # 定义doc,输入html源代码 d ...

  4. 日常破解---XCTF_APP1获取flag记录

    日常破解---XCTF_APP1获取flag记录 一.题目来源   来源:XCTF社区安卓题目app1 二.解题记录     1.首先安装到模拟器中运行一下,如下图所示,点击一下按钮,弹出提示年轻人不 ...

  5. Google Flutter Clock 大赛优秀项目推荐

    Flutter 在 Google 加持下,如今可以作为跨平台首选了.早在 Flutter 刚刚出现强势苗头,我作为第一批体验了一把,<Flutter 初尝:从 Java 无缝过渡>,不过也 ...

  6. throttle工具函数

    // fn是我们需要包装的事件回调, delay是时间间隔的阈值 export function throttle(fn, delay) { // last为上一次触发回调的时间, timer是定时器 ...

  7. Java学习笔记(3)——有关异常

    异常处理: try { }catch(ExceptionType0 e) { }catch(ExceptionType1 e) { }.....finally { } 有四种情况不执行finally语 ...

  8. kali的安装详解--摘自官方

    官方网址:https://www.kali.org/docs/virtualization/install-vmware-workstation-player-kali-guest-vm/ 在VMwa ...

  9. JAVA正则-检验QQ是否合法

    /* * 0不能开头,全数字,位数5-10位 * 123456 */ public static void checkQQ(){ String QQ = " 123456 "; / ...

  10. ASP.NET Core 核心特性--宿主、启动、中间件

    宿主 public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().R ...