码迷,mamicode.com
首页 > 编程语言 > 详细

多线程(what?why?how?)

时间:2016-07-14 02:11:28      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

同步格言:如果向一个变量写入值,而这个变量接下来可能被另一个线程读取,或者,从一个变量读取,而这个变量可能是之前被一个线程写入的,此时必须使用同步。

一、引入多线程

  生活工作中,使用电脑操作系统中多个任务(multitasking):在同一刻运行多个程序的能力。例如:在编辑和下载邮件的同时可以打印文件。

  多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。每一个任务成为一个线程(thread),它是线程控制的简称。

  可以同时运行一个以上线程的程序称为多线程程序(multithreaded)。

  应用场景:一个浏览器可以同时下载几幅图片;一个Web服务器需要同时处理几个并发的请求

二、

  java中使用线程的两种方式:继承Thread类和实现Runable接口。

  线程的6中状态:

  • New(新创建)
  • Runnable(可运行)
  • Blocked(被阻塞)
  • Waiting(等待)
  • Timed waiting(计时等待)
  • Terminated(被终止)
 1 package com.jjuina;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 /**
 6  * 不论如何定义线程,如果没有启动线程,线程就不会执行
 7  * main方法程序的主线程,程序被调用的执行的时候,执行的就是main方法的线程
 8  * 为什么要使用线程,是为了提升程序的执行效率,也就是能力
 9  * 一段程序在单线程完成工作,需要时间为100
10  * 那么如果再多加一个线程,也就是让这段程序在两个线程上执行,那么它完成工作,只需要50
11  * @author jiaju
12  *
13  */
14 public class Thread {
15     public static void main(String[] args) throws ClassNotFoundException {
16         java.lang.Thread thread = new java.lang.Thread(new Runnable() {
17             
18             public void run() {
19                 System.out.println("pong");
20                 
21             }
22         });
23         thread.start();
24         System.out.println("ping");25     }
26 }

sleep()和wait()

  sleep()方法是Thread类的方法,可以指定参数时间,意为使线程休眠一段时间后执行。

  wait()方法是Object类的方法,使线程进入等待状态,如果要结束等待状态,须使用notify()唤醒该线程。

 

如何终止线程?

  1. 当run()方法执行结束,线程自动终止;
  2. 使用stop()方法终止线程,不被建议使用;
  3. 使用interrup()方法中断线程;
  4. 使用join()方法,等待终止指定的线程。

线程安全的集合:

  java.util.concurrent包提供了映射表、有序集和队列的高效实现:ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue.

  较早的线程安全集合使用方法:任何集合类通过使用 同步包装器(synchronization wrapper)可以变成线程安全的

    List<E> synchArrayList = Collections.synchronizedList(new ArrayList<E>());

    Map<K, V> synchHashMap = Collections.synchronizedMap(new HashMap<K, V>());

  ps:最好使用java.util.concurrent包中定义的集合,不使用同步包装器中的。

三、线程池

  1. 为什么要使用线程池?

    第一、使用线程池中的线程,在run()方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务;

    第二、使用线程池中的线程,可以减少并发线程的数目。

  2. 使用执行器(Executor)创建线程池

 

多线程(what?why?how?)

标签:

原文地址:http://www.cnblogs.com/jjuina/p/5668260.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!