多进程概念
当前的操作系统都是多任务OS
每个独立执行的任务就是一个进程
多进程的优点
多进程的缺点
多线程概念
一个程序可以包括多个子任务,可串/并行
每个子任务可以称为一个线程
如果一个子任务阻塞,程序可以将CPU调度另外一个子任务进行工作。这样CPU还是保留着本程序中,而不是被调度到别的程序(进程)中,提高本程序所获得CPU时间和利用率。
多进程和多线程对比
java.lang.Thread
线程继承Thread类,实现run方法
public class Thread1 extends Thread {
	public void run()
	{
		System.out.println("hello");
	}
}
java.lang,.Runnable接口
线程实现Runnable接口,实现run方法
public class Thread2 implements Runnable {
	public void run()
	{
		System.out.println("hello");
	}
}
/* 启动方法 */
new Thread(new Thread2()).start();
Java的四个主要接口:
Clonable,用于对象克隆
Comparable,用于对象比较
Serializable,用于对象序列化
Runnable,用于对象线程化
启动
Thread vs Runnable
Thread占据了父类的名额,不如Runnable方便
Thread类实现Runnable
Runnable启动时需要Thread类的支持
Runnable更容易实现多线程中资源共享(Thread里必须用static变量,才能实现变量共享,Runnable通过普通变量便可达到)
一个线程只能启动一次,通过Thread实现线程时,线程和线程所要执行的任务是捆绑在一起的。也就使得一个任务只能启动一个线程,不同的线程执行的任务是不相同的,所以没有必要,也不能让两个线程共享彼此任务中的资源。
一个任务可以启动多个线程,通过Runnable方式实现的线程,实际是开辟一个线程,将任务传递进去,由此线程执行。可以实例化多个 Thread对象,将同一任务传递进去,也就是一个任务可以启动多个线程来执行它。这些线程执行的是同一个任务,所以他们的资源是共享。
结论:建议实现Runnable接口来完成多线程
线程类
粗粒度:子线程与子线程之间、和main线程之间缺乏交流
细粒度:线程之间有信息交流通讯
通过共享变量在多个线程中共享消息
多线程信息共享问题
i++,并非原子性操作

变量副本问题的解决方法
采用volatile关键字修饰变量
用volatile修饰的变量可以及时在各线程里面通知
保证不同线程对共享变量操作时的可见性
关键步骤加锁限制
互斥的关键字是synchronized
线程状态
Thread的部分API已经废弃
线程阻塞/和唤醒
线程被动地暂停和终止
线程主动暂停和终止
多线程死锁
守护(后台)线程
线程查看工具:jvisualvm
原文:https://www.cnblogs.com/hunter-w/p/13929559.html