初次了解的Java多线程

    0.1熟悉多线程编程

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

 0.2 多线程的定义并发

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

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

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

0.3多线程的缺点优化

·若是有大量的线程,会影响性能,由于 操做系统须要在它们之间切换。this

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

·线程可能会给 程序带来更多“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(); }    }}

相关文章
相关标签/搜索