Java线程及其实现方式
一、线程&多线程
线程:
线程是进程的一个实体,是 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类似,但是功能更强大,具体表现在:
- 可以在任务结束后提供一个返回值,Runnable不行
- call方法可以抛出异常,Runnable的run方法不行
- 可以通过运行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线程及其实现方式的更多相关文章
- Java线程的创建方式三:Callable(四)
一.Java实现多线程的三种方式 方式一:继承Thread类: public class Test extends Thread { public static void main(String[] ...
- Java线程同步的方式
java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的 ...
- java 线程传参 方式
第一类:主动向线程传参 public class ThreadTest extends Thread { public ThreadTest() { } /** * 第一种通过构造方法来传递参数 ...
- Java线程的启动与中止
一.线程与进程的关系 关于进程与线程,百度百科上是这样描述的: 进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 在当 ...
- Java 线程间通讯(共享变量方式)
Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题. 一.没考虑线程同步: package com.wyf; publi ...
- Java线程间通信-回调的实现方式
Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...
- Java线程的三种方式
创建线程有三种方式: 1.继承Thread类 2.实现Runnable接口 3.使用Callable和Future创建线程 三种方式详解如下: ---------------------------- ...
- java线程实现的四种方式
java多线程的实现可以通过以下四种方式 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法 3.通过Callable和FutureTask创建线程 4.通过线程池创 ...
- [转载]Java线程的两种实现方式
转载:http://baijiahao.baidu.com/s?id=1602265641578157555&wfr=spider&for=pc 前言 线程是程序的一条执行线索,执行路 ...
随机推荐
- 【30分钟学完】canvas动画|游戏基础(4):边界与碰撞
前言 本系列前几篇中常出现物体跑到画布外的情况,本篇就是为了解决这个问题. 阅读本篇前请先打好前面的基础. 本人能力有限,欢迎牛人共同讨论,批评指正. 越界检测 假定物体是个圆形,如图其圆心坐标即是物 ...
- 使用selenium模拟登陆淘宝、新浪和知乎
如果直接使用selenium访问淘宝.新浪和知乎这些网址.一般会识别出这是自动化测试工具,会有反制措施.当开启开发者模式后,就可以绕过他们的检测啦.(不行的,哭笑) 如果网站只是对windows.na ...
- MySQL中SQL Mode的查看与设置
MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql_mode 的值.本文主要介绍一下这个值的查看与设置,主要在Mac系统下. 对于每个模式的意义和作用 ...
- Overt.GrpcTemplate.Service 模板使用教程
阅读这篇文章需要先阅读我的另外一篇文章,目前还未发布出来,待发布中... 1. Overt.GrpcTemplate.Service .Net Core 3.1 版本 模板名称改成 Overt.Grp ...
- C++ 继承函数
#include <iostream> using namespace std; class passport { public: passport() //默认构造 { } passpo ...
- Linux常用命令 - wget命令详解(重点)
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 下载i ...
- vscode不能打开浏览器(Open browser failed!! Please check if you have installed the browser correctly!)
vscode出现上述问题,我也查了很多相关资料,什么改默认浏览器设置什么的,改配置,改系统环境变量什么的,不但麻烦而且最后都难以成功. 下面分享一个可以解决的最简单办法.那就是:舍弃open in b ...
- c# Dictionary<string, object> 转JSON字符串
JavaScriptSerializer jss = new JavaScriptSerializer(); Dictionary<string, object> dict = new D ...
- android studio 添加GSON
- HTTPS加密传输过程
HTTPS加密传输过程 HTTPS全称Hyper Text Transfer Protocol over SecureSocket Layer,是以安全为目标的HTTP通道,在HTTP的基础上通过传输 ...