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多线程(一):线程与进程的更多相关文章

  1. Java多线程:线程与进程

    实际上,线程和进程的区别,在学OS时必然是学习过的,所缺的不过是一些总结. 1. 进程 2. 线程 3. 进程与线程 4. 多进程与多线程对比 5. Java多进程与多线程 5.1. Java多进程 ...

  2. Java多线程之线程的控制

    Java多线程之线程的控制 线程中的7 种非常重要的状态:  初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dea ...

  3. JAVA多线程之线程间的通信方式

    (转发) 收藏 记 周日,北京的天阳光明媚,9月,北京的秋格外肃穆透彻,望望窗外的湛蓝的天,心似透过栏杆,沐浴在这透亮清澈的蓝天里,那朵朵白云如同一朵棉絮,心意畅想....思绪外扬, 鱼和熊掌不可兼得 ...

  4. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  5. 处理java多线程时线程安全问题 - ThreadLocal和Synchronized

    多线程在自动化测试中用的不多,也就是说我们用单线程可以完成大部分的自动化测试脚本. 主要有两个原因,首先是因为自动化测试首要考虑的是脚本的稳定性,所以一般会牺牲效率以保证脚本稳定,其次是由于局限于我们 ...

  6. java多线程之 ---- 线程死锁

    java多线程之线程死锁 产生死锁的主要原因: 由于系统资源不足. 进程执行推进的顺序不合适. 资源分配不当等. 假设系统资源充足.进程的资源请求都可以得到满足,死锁出现的可能性就非常低.否则就会因争 ...

  7. Java多线程| 01 | 线程概述

    Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...

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

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

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

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

  10. Java多线程之线程的同步

    Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同 ...

随机推荐

  1. Dubbo系列(一)dubbo的产生背景与原理概述

    一.Dubbo框架的产生背景        大规模服务化之前,应用只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡. (1) ...

  2. Windows环境安装MySQL8.0.11

    网络开发数据库是必不可少的.曾经安装个Mysql,但是忘了.再次安装还是得百度.那还不如自己写篇博客记录一下呢,以后再忘记就看自己的博客好 Mysql官网安装地址(windows环境): https: ...

  3. 利用简易爬虫完成一道基础CTF题

    利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...

  4. CentOS 7服务器下Nginx安装配置

    一.安装编译工具及库文件 $ yum -y install make zlib zlib-devel gcc gcc-c++ libtool openssl openssl-devel pcre pc ...

  5. RoP

    RoPS特征提取 RoPS为Rotational Projection Statistics的简写,即旋转投影统计特征.RoPS特征具有对点云旋转和平移(即姿态变化)的不变性,具备很强的鉴别力以及对噪 ...

  6. js中bind解析

    一.arguments的含义 // arguments 是一个对应于传递给函数的参数的类数组对象 function a(){ console.log(arguments); } a(); // Arg ...

  7. java.lang.reflect.Method.getAnnotation()方法示例

    转: java.lang.reflect.Method.getAnnotation()方法示例 作者: 初生不惑 Java技术QQ群:227270512 / Linux QQ群:479429477   ...

  8. 饿了么这样跳过Redis Cluster遇到的“坑”

    内容来源:2017 年 8 月 12 日,饿了么高级Python工程师黄光星在“CRUG 2017北京活动”进行<Redis Cluster运维方案>演讲分享.IT 大咖说(微信id:it ...

  9. HashPump用法

    做哈希长度扩展攻击的时候用到这个工具,但是没找到这个工具详解办法 我这篇不算是详解,只是收集例子做出的一个用法 HashPump一种在各种散列算法中利用散列长度扩展攻击的工具.目前支持的算法:MD5, ...

  10. Linux下十大命令行下载工具

    Wget 这是最有名的工具,可用于通过CLI下载.这款工具功能很丰富,可以充当某种功能完备的GUI下载管理器,它拥有一款理想的下载管理器所需要的所有功能,比如它可以恢复下载,可以下载多个文件,出现某个 ...