一、 基本概念
1. 多线程
指的是这个程序(一个进程)运行时产生了不止一个线程。
2. 并行与并发
并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。
3. 线程安全
经常用来描绘一段代码。指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果,如不加事务的转账代码。
4. 同步
Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。如上面的代码简单加入@synchronized关键字。在保证结果准确的同时,提高性能,才是优秀的程序。线程安全的优先级高于性能。
二、 线程状态
可以通过java.lang.Thread.State查看,一共有六种状态。
1. NEW(新建)至今尚未启动的线程的状态。
2. RUNNABLE (可运行)可运行线程的线程状态。处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。
3. BLOCKED (被阻塞)受阻塞并且正在等待监视器锁的某一线程的线程状态。处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用Object.wait 之后再次进入同步的块/方法。
4. WAITING (等待)某一等待线程的线程状态。某一线程因为调用下列方法之一而处于等待状态。
5. TIMED_WAITING(计时等待) 具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态。
6. TERMINATED (被终止)已终止线程的线程状态,线程已经结束执行。
三、 线程创建的三种方法
package com.sc.thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThreadDemo{
public static void main(String[] args) {
//-------------1------------
//new ExThread().start();
//-------------2------------
//new Thread(new ImplementsRunnable()).start();
//-------------3------------
try {
FutureTask<Integer> oneTask = new FutureTask<Integer>(new ImplementsCallable());
new Thread(oneTask).start();
System.out.println(oneTask.get());//5
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
class ExThread extends Thread{
@Override
public void run() {
System.out.println("This is extends thread.");
}
}
class ImplementsRunnable implements Runnable{
@Override
public void run() {
System.out.println("This is implements Runnable thread.");
}
}
class ImplementsCallable implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println("This is implements Runnable thread.");
return 5;
}
}