0.1熟悉多线程

多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称 多处理机、 多核心处理器以及芯片级多处理(Chip-levelmultithreading)或同时多线程(Simultaneousmultithreading)处理器。 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。

0.2 多线程的定义

每个正在系统上运行的 程序都是一个 进程。每个 进程包含一到多个线程。 进程也可能是整个 程序或者是部分程序的动态执行。线程是一组 指令的集合,或者是 程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的 进程,它负责在单个 程序里执行多 任务。通常由 操作系统负责多个线程的调度和执行。

线程是 程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.

线程和 进程的区别在于,子进程和 父进程有不同的 代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行 堆栈和 程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体 情况而定. 线程的运行中需要使用计算机的 内存资源和CPU。

0.3多线程的缺点

·如果有大量的线程,会影响性能,因为 操作系统需要在它们之间切换。

·更多的线程需要更多的 内存空间。

·线程可能会给 程序带来更多“bug”,因此要小心使用。

·线程的中止需要考虑其对 程序运行的影响。

·通常块模型数据是在多个线程间共享的,需要防止线程死锁 情况的发生。

一些线程模型的背景

可以重点讨论一下在 Win32环境中常用的一些模型。

·单线程模型

在这种线程模型中,一个 进程中只能有一个线程,剩下的进程必须等待当前的线程执行完。这种模型的缺点在于系统完成一个很小的 任务都必须占用很长的时间。

·块线程模型( 单线程多块模型STA)

这种模型里,一个 程序里可能会包含多个执行的线程。在这里,每个线程被分为 进程里一个单独的块。每个进程可以含有多个块,可以共享多个块中的数据。 程序规定了每个块中线程的执行时间。所有的请求通过 Windows消息队列进行 串行化,这样保证了每个时刻只能访问一个块,因而只有一个单独的 进程可以在某一个时刻得到执行。这种模型比 单线程模型的好处在于,可以响应同一时刻的多个用户请求的 任务而不只是单个用户请求。但它的性能还不是很好,因为它使用了 串行化的线程模型, 任务是一个接一个得到执行的。

·多线程块模型(自由线程块模型)

多线程块模型(MTA)在每个 进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要 消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的 程序比 单线程模型和STA的执行速度都要快,因为降低了系统的负载,因而可以优化来减少系统idle的时间。这些 应用程序一般比较复杂,因为 程序员必须提供 线程同步以保证线程不会并发的请求相同的资源,因而导致竞争 情况的发生。这里有必要提供一个锁机制。但是这样也许会导致系统死锁的发生。

进程和线程都是 操作系统的概念。 进程是 应用程序的执行实例,每个进程是由私有的虚拟 地址空间、 代码、数据和其它各种 系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的 系统资源进程终止时被释放或关闭。

线程是 进程内部的一个执行单元。系统创建好 进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数 地址形式,比如说main或WinMain函数,将 程序的启动点提供给Windows系统。主执行线程终止了, 进程也就随之终止。

每一个 进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在 应用程序中创建其它线程,多个线程并发地运行于同一个 进程中。一个 进程中的所有线程都在该进程的 虚拟地址空间中,共同使用这些虚拟地址空间、 全局变量和系统资源,所以线程间的通讯非常方便, 多线程技术的应用也较为广泛。多线程可以实现 并行处理,避免了某项 任务长时间占用CPU时间。要说明的一点是,到2015年为止,大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程, 操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供 时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。C++ 11 标准中,STL类库也实现了多线程的类std::thread,使得多线程编程更加方便。

0.4经典案例代码

package cn.thread;

public class Through_out_bridge {

public static void main(String[] args) {
Bridge b = Bridge.getInstance();//实例化桥
//实例化左端9个人,此时所有人都不能过桥,桥的可以状态标志为不可以用
for (int i = 1; i <= 9; i++) {
     Thread t = new Thread(new Person(false, i, b));
     t.start();
}
//实例化右端12个人,此时所有人都不能过桥,桥的可以状态标志为不可以用
for( int i=1 ;i<=12;i++)
{
     Thread t = new Thread(new Person(true,i,b));
     t.start();
}
//桥的可用状态给左端第10个人,可以自定义给谁
b.state = true;
Thread t = new Thread(new Person(false, 10, b));
    }

}

class Person implements Runnable {

public Bridge bridge;//桥
    private String hand;//在桥哪一端
    int No;//序号

public Person(boolean side, int i, Bridge bridge) {

this.No = i;
this.bridge = bridge;
if(bridge.state)
{
     System.out.println(i+"已经过桥。");
}
if (side) {
     this.hand = new String("右");
} else {
     this.hand = new String("左");
}
    }

//过桥方法
    public synchronized void through() throws InterruptedException {

if (bridge.state) {
     System.out.println(hand+"边第"+No + "在过桥");
     bridge.open( No);
} else {
     bridge.lock(No);
   
}
    }

public void run() {
try {
     Thread.sleep(1000);
//     System.out.println(No+hand+" 边已经过桥!");
     through();
} catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
}
    }
}

class Bridge {
    //可用状态判断true:可用
    public boolean state = false;
    //自行实例化
    public static Bridge getInstance() {
return new Bridge();
    }

public synchronized void open(int i) throws InterruptedException {
if (state) {
     Thread.sleep(1000);
     this.state=true;
     notify();
}
    }

public synchronized void lock(int i) throws InterruptedException {
if (!state) {
     this.state=false;
     System.out.println(i + " 在等待.");
     wait();
}
    }
}

初次了解的Java多线程的更多相关文章

  1. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  2. Java多线程面试题整理

    部分一:多线程部分: 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. ...

  3. 互联网校招面试必备——Java多线程

    本文首发于我的个人博客:尾尾部落 本文是我刷了几十篇一线互联网校招java后端开发岗位的面经后总结的多线程相关题目,虽然有点小长,但是面试前看一看,相信能帮你轻松啃下多线程这块大骨头. 什么是进程,什 ...

  4. java多线程----悲观锁与乐观锁

    java多线程中悲观锁与乐观锁思想 一.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线 ...

  5. 031.[转] 从类状态看Java多线程安全并发

    从类状态看Java多线程安全并发 pphh发布于2018年9月16日 对于Java开发人员来说,i++的并发不安全是人所共知,但是它真的有那么不安全么? 在开发Java代码时,如何能够避免多线程并发出 ...

  6. Java多线程编程(4)--线程同步机制

    一.锁 1.锁的概念   线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题.锁 ...

  7. Java多线程(一)——线程基础和锁锁锁

    目录 Java多线程(一) 一.线程的定义 二.Synchronize线程同步 三.偏向锁.自旋锁.重量级锁 四.volatile关键字 五.Compare And Swap无锁自旋优化技术和ABA版 ...

  8. 赶紧收藏!王者级别的Java多线程技术笔记,我java小菜鸡愿奉你为地表最强!

    Java多线程技术概述 介绍多线程之前要介绍线程,介绍线程则离不开进程. 首先 , 进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元: 线程:就 ...

  9. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

随机推荐

  1. python 基础

    Python基础 三元运算(三目运算),是对简单的条件语句的缩写. # 书写格式 result = 值1 if 条件 else 值2 # 如果条件成立,那么将 “值1” 赋值给result变量,否则, ...

  2. 【Scala】尾递归优化

    以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么.在函数式编程中,随处可见递归思想的运用.下面给出几个递归函数的例子: object RecursiveExample extends App{ ...

  3. iOS 常用的向上,向下取整, 四舍五入函数

    向上取整:ceil(x),返回不小于x的最小整数; 向下取整:floor(x),返回不大于x的最大整数; 四舍五入:round(x) 截尾取整函数:trunc(x)  

  4. <meta>指定浏览器模式(browser mode)或文档模式(document mode)无效

    这是前两天解决的一个故障,准确的说它不是一个SharePoint的问题,而是IE8浏览器或者说是HTML代码的问题,但我感觉还是挺有意思的,所以贴上来分享一下. 基础知识 简单的讲,就是IE浏览器中有 ...

  5. 【5集iCore3_ADP演示视频】5-5 iCore3应用开发平台示波器和信号源校准

    iCore3双核心应用开发平台基于iCore3双核心板,包含ARM.FPGA.7寸液晶屏.双通道数字示波器.任意波发生器.电压表等模块,是一款专为电子爱好者设计的综合性电子学习系统. [视频简介]本视 ...

  6. django 有model生成SQL以及现有反向表生成model

    已有models生成SQL语句 语法 python manage.py sqlall app_name   # app_name, 在settings已经导入, 如: INSTALLED_APPS = ...

  7. 给Source Insight做个外挂系列之四--分析“Source Insight”

    外挂的目的就是将代码注入到其它进程中,所以必须要有目标进程才能完成注入,而所谓的目标进程通常是某软件的一部分或者是全部,所以要对目标程序有深入地了解.一般外挂都是针对某个应用程序开发的,其装载.运行都 ...

  8. python批量进行文件修改操作

    python批量修改文件扩展名 在网上下载了一些文件,因为某种原因,扩展名多了一个后缀'.xxx',手动修改的话因为文件太多,改起来费时费力,于是决定写个小脚本进行修改. 1.要点: import r ...

  9. PostgreSQL JSON函数

    https://www.postgresql.org/docs/9.6/static/functions-json.html PostgreSQL 9.6.1 Documentation Prev U ...

  10. Bittorrent Protocol Specification v1.0 中文

    翻译:小马哥 日期:2004-5-22 BitTorrent 是一种分发文件的协议.它通过URL来识别内容,并且可以无缝的和web进行交互.它基于HTTP协议,它的优势是:如果有多个下载者并发的下载同 ...