Java多线程(一):线程与进程
1.线程和进程
1.1 进程
进程是操作系统的概念,我们运行的一个TIM.exe就是一个进程。

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体

1.2 线程
线程是依附于进程而存在的,每一个线程必须有父进程;
线程拥有自己的堆栈、程序计数器和局部变量,线程和其他的线程共享进程的系统资源;
进程不能共享内存,而线程之间可以轻松地共享内存

2.多线程的意义
2.1 发挥多核处理器最大性能
如一个四核处理器去运行单线程任务,一个核心只能运行一个线程,那么三个核心的性能就会被浪费。再如服务器32核CPU运行一个单线程任务,31个核心在“偷懒”,大大地浪费了服务器性能;
比如博主的电脑CPU是i7 6700HQ,四核八线程。该CPU用到了超线程技术。简单地说,一个单核心的处理器,去模拟出双核心的环境,但这并非能够把处理器的效能提升双倍,原因在于实体的核心始终只有一个,而效能有约百分之二十至三十增长。
我们可以理解成阉割版八核处理器,难道买不起八核,还买不起八线程处理器吗?
2.2 发挥单核处理器最大性能
如果进程是单线程的,它在等待某个I/O操作完成,此时处理器处于空闲状态;如果进程是多线程的,一个线程在等待某个I/O操作完成的时候,另外一个线程可以执行。
单核处理器执行多线程的情况
1.单核CPU同一时间,CPU只能处理1个线程,只有1个线程在执行
2.多线程同时执行:是CPU快速的在多个线程之间的切换
3.CPU调度线程的时间足够快,使我们产生错觉,多线程“同时”执行
4.如果线程数非常多,CPU会在n个线程之间切换,消耗大量的CPU资源,每个线程被调度的次数会降低,线程的执行效率降低
3.创建线程
3.1 继承Thread
继承Thread,重写run方法。
public class MyThread00 extends Thread{
public void run()
{
for (int i = 0; i < 50; i++)
{
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
public static void main(String[] args)
{
MyThread00 mt0 = new MyThread00();
//启动线程
mt0.start();
//main线程
for (int i = 0; i < 50; i++)
{
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
}
start方法:
调用start方法Java虚拟机会启动run方法;
一个线程不能多次调用start方法;
死去的线程不能被重启;
执行结果如下:
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
......
线程交替执行,不会按照固定顺序执行,每次执行的结果都不一致。
3.2 实现Runnable
实现Runnable接口,重写run方法;有利于代码解耦。
public class MyThread01 implements Runnable
{
public void run()
{
for (int i = 0; i < 50; i++)
{
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
public static void main(String[] args)
{
MyThread01 mt0 = new MyThread01();
Thread t = new Thread(mt0);
//启动线程
t.start();
//main线程
for (int i = 0; i < 50; i++)
{
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
}
执行结果类似于3.1
3.3 实现Callable
实现Callable创建线程,重写call方法,该方法可以返回值和抛出异常
public class MyThread02 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("计算处理中...");
Thread.sleep(3000);
return 1;
}
public static void main(String[] args) {
//构建任务
MyThread02 t = new MyThread02();
//执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果
FutureTask<Integer> task = new FutureTask<Integer>(t);
//启动线程
new Thread(task).start();
//获取结果
try {
Integer integer = task.get(5000,TimeUnit.MILLISECONDS);
System.out.println("线程执行结果:"+integer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果如下
计算处理中...
线程执行结果:1
我们获取到了call方法的返回值,继承Thread和实现Runnable方式创建线程无法获得返回值
Java多线程(一):线程与进程的更多相关文章
- Java多线程:线程与进程
实际上,线程和进程的区别,在学OS时必然是学习过的,所缺的不过是一些总结. 1. 进程 2. 线程 3. 进程与线程 4. 多进程与多线程对比 5. Java多进程与多线程 5.1. Java多进程 ...
- Java多线程之线程的控制
Java多线程之线程的控制 线程中的7 种非常重要的状态: 初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dea ...
- JAVA多线程之线程间的通信方式
(转发) 收藏 记 周日,北京的天阳光明媚,9月,北京的秋格外肃穆透彻,望望窗外的湛蓝的天,心似透过栏杆,沐浴在这透亮清澈的蓝天里,那朵朵白云如同一朵棉絮,心意畅想....思绪外扬, 鱼和熊掌不可兼得 ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- 处理java多线程时线程安全问题 - ThreadLocal和Synchronized
多线程在自动化测试中用的不多,也就是说我们用单线程可以完成大部分的自动化测试脚本. 主要有两个原因,首先是因为自动化测试首要考虑的是脚本的稳定性,所以一般会牺牲效率以保证脚本稳定,其次是由于局限于我们 ...
- java多线程之 ---- 线程死锁
java多线程之线程死锁 产生死锁的主要原因: 由于系统资源不足. 进程执行推进的顺序不合适. 资源分配不当等. 假设系统资源充足.进程的资源请求都可以得到满足,死锁出现的可能性就非常低.否则就会因争 ...
- Java多线程| 01 | 线程概述
Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...
- Java多线程之线程其他类
Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...
- Java多线程之线程的通信
Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些 ...
- Java多线程之线程的同步
Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同 ...
随机推荐
- vs下qt的信号与槽实现
实现主窗口中Add按钮的功能, 这一部分要特别注意,除了实现功能代码外,还需自己手动添加一些其他的代码(Qt Creator可以自动添加). 我们需要在2个地方添加代码. 第1个是在addressbo ...
- centos 下启动 rabbitmq 报错的解决
安装 rabbitmq 后进行了一些配置,然后启动服务: service rabbitmq-server start 无法启动.通过 journalctl -xe 查看日志后,有如下日志: ... - ...
- 对于ssh服务的简单配置,似的自己的服务器更加安全
对于一台服务器,最大的问题莫过于安全.没有安全性的服务器即使再牛*,性能再好,作用再大,也是分分钟被人搞定,而且还是揉虐性的...当然万事没有绝对的安全,我们只是将危险降低而已.本文只针对于ssh服务 ...
- Rvm 进行gem安装时必须输入密码Your user account isn't allowed to install to the system RubyGems 解决方案
今天开发过程中,从master拉下代码后重启项目,想用控制台时,却发现需要密码??并且三次密码确认后还是疯狂报错. 当时第一想到是rvm版本不一致,随即则检查了版本跟gem生成,当确认rvm版本无误时 ...
- Nginx设置成服务并开机自动启动
在/etc/init.d下创建文件nginx [root@localhost ~]# vim /etc/init.d/nginx 其内容参考nginx官方文档 需要注意的配置: nginx=”/usr ...
- php上传文件夹
用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个php文件夹上传下载的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助. 功能介绍: 树形目录导航.您可以通 ...
- dbgrideh 中的keylist,picklist的用法
dbgrideh procedure TForm1.FormCreate(Sender: TObject); begin DBGridEh1.DataSource:=DataSource1; Data ...
- 基于scrapy框架的爬虫
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. scrapy 框架 高性能的网络请求 高性能的数据解析 高性能的 ...
- DS18b20温度传感器基础使用
认识管脚 认识唯一标示的64位地址序列号 寄存器数据译码成温度值(下面只针对12位转化的,还有9..10等其他位的转化方式,不同位的转化,其精度也不同) 传感器存储器 配置寄存器使用说明 DS18b2 ...
- Windows10和Windows Server 2019支持OpenSSH
从 Win10 1809 和 Windows Server 2019 开始 Windows 开始支持 OpenSSH Server.本文介绍一下其基本的概念和配置方法,本文演示用的环境为 Win10 ...