标签:
同步格言:如果向一个变量写入值,而这个变量接下来可能被另一个线程读取,或者,从一个变量读取,而这个变量可能是之前被一个线程写入的,此时必须使用同步。
一、引入多线程
生活工作中,使用电脑操作系统中多个任务(multitasking):在同一刻运行多个程序的能力。例如:在编辑和下载邮件的同时可以打印文件。
多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。每一个任务成为一个线程(thread),它是线程控制的简称。
可以同时运行一个以上线程的程序称为多线程程序(multithreaded)。
应用场景:一个浏览器可以同时下载几幅图片;一个Web服务器需要同时处理几个并发的请求
二、
java中使用线程的两种方式:继承Thread类和实现Runable接口。
线程的6中状态:
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()唤醒该线程。
如何终止线程?
线程安全的集合:
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)创建线程池
标签:
原文地址:http://www.cnblogs.com/jjuina/p/5668260.html