zoukankan      html  css  js  c++  java
  • 多线程总结一:基本概念

    1、线程和进程
    a、并发性(concurrency):在同一时刻只能有一条指令执行,当多个进程指令被快速轮换执行,在宏观上具有多个进程同时执行的效果。
    b、并行性(parallel):在同一时刻,有多条指令在多个处理器上同时执行。
    c、操作系统可以同时执行多个任务,每个任务就是进程;进程可以同时执行多个任务,每个任务就是线程。
    d、操作系统支持多进程并发采用的策略有:共享式多任务操作策略(Windows3.1、Mac OS9)、抢占式多任务操作策略(Windows NT、Windows 2000以及UNIX/Linux等)。

    2、多线程的优势
    a、进程之间不能共享内存,但线程之间共享内存容易;
    b、系统创建进程时需要为该进程重新分配系统资源,但创建线程代价小得多,因此使用多线程来实现多任务并发比多进程效率高;
    c、Java语言内置了多线程功能支持,而不是单纯的作为底层操作系统的调度方式,从而简化了Java的多线程编程;

    3、多线程的应用场景

    一个浏览器必须能同时下载多个图片、一个Web服务器必须能同时响应多个用户请求、Java虚拟机本身就在后台提供一个超级线程来进行垃圾回收、图形
    用户界面(GUI)应用也需要启动单独的线程从主机环境收集用户界面事件……

    4、线程的创建和启动
    a、继承Thread类创建线程类

     1 /**
     2  * @Title: FirstThread.java 
     3  * @Package  
     4  * @author 任伟
     5  * @date 2014-12-5 下午3:05:49 
     6  * @version V1.0  
     7  */
     8 
     9 /**
    10  * @ClassName: FirstThread
    11  * @Description: 通过继承Thread创建线程类
    12  * @author 任伟
    13  * @date 2014-12-5 下午3:05:49
    14  */
    15 public class FirstThread extends Thread {
    16     private int i;
    17 
    18     public void run() {
    19         for (; i < 100; i++) {
    20             // this获取当前线程
    21             // getName()获取当前线程名称
    22             System.out.println(this.getName() + " " + i);
    23         }
    24     }
    25 
    26     public static void main(String[] args) {
    27         for (int i = 0; i < 100; i++) {
    28             System.out.println(Thread.currentThread().getName() + " " + i);
    29             if(20==i){
    30                 Thread t1 = new FirstThread();
    31                 t1.setName("线程1");
    32                 Thread t2 = new FirstThread();
    33                 t2.setName("线程2");
    34                 
    35                 t1.start();
    36                 t2.start();
    37             }
    38         }
    39     }
    40 }
    FirstThread

    b、使用继承Thread类的方法来创建线程类时,多个线程之间无法共享线程类的实例变量。

    c、实现Runnable接口创建线程类

     1 /**
     2  * @Title: SecondThread.java 
     3  * @Package  
     4  * @author 任伟
     5  * @date 2014-12-5 下午6:53:07 
     6  * @version V1.0  
     7  */
     8 
     9 /**
    10  * @ClassName: SecondThread
    11  * @Description:
    12  * @author 任伟
    13  * @date 2014-12-5 下午6:53:07
    14  */
    15 public class SecondThread implements Runnable {
    16     private int i;
    17 
    18     /*
    19      * (non-Javadoc)
    20      * 
    21      * @see java.lang.Runnable#run()
    22      */
    23     @Override
    24     public void run() {
    25         for(;i<100;i++){
    26             System.out.println(Thread.currentThread().getName()+" "+i);
    27         }
    28 
    29     }
    30 
    31     public static void main(String[] args) {
    32         for (int i = 0; i < 100; i++) {
    33             System.out.println(Thread.currentThread().getName()+" "+i);
    34             if(20==i){
    35                 SecondThread st = new SecondThread();
    36                 new Thread(st, "线程1").start();
    37                 new Thread(st, "线程2").start();
    38             }
    39         }
    40     }
    41 
    42 }
    SecondThread

    d、Runnable对象仅仅作为Thread对象的target,Runnable实现类里包含的run()方法仅作为线程的执行体。而实际的线程对象依旧是Thread实例,只是该Thread线程负责执行其target的run()方法。

    e、采用实现Runnable接口的方式创建多线程,线程类还可以继承其他类;多个线程可以共享一个target对象,便于多个线程处理同一份资源的情况;
    f、采用继承Thread类的方式创建多线程,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

  • 相关阅读:
    Redis之通用的key操作命令
    Redis常用命令之操作Set(集合)
    Redis常用命令之操作SortedSet(有序集合)
    Redis常用命令之操作List类型
    Winform中实现监控CPU内存使用率(附代码下载)
    Ubuntu安装配置mongodb
    修改Ubuntu国内镜像
    redis安装和配置
    爬虫(十六):scrapy爬取知乎用户信息
    爬虫(十五):scrapy中的settings详解
  • 原文地址:https://www.cnblogs.com/renwei/p/4147396.html
Copyright © 2011-2022 走看看