java线程简单理解
线程的定义
Thread是操作系统中能够操作运行的最小单位,它包含在进行之中,是进程中的实际运行单位,一般情况下同一个进程中运行着多个线程。一个核上往往只能执行一个进程中的一个线程。—计算机看起来像是在运行多个进程,实际上是因为在计算机中任务切换速度非常快,超过人的反应。— 进程的执行在宏观上并行的,在微观上是串行的。
线程的内存机制
jvm将内存分为堆内存、栈内存、方法区、本地方法栈、寄存器。
所有的线程会共享的内存有:堆内存和方法区
每个线程都有自己独有的内存区域:栈内存、本地方发栈、寄存器
线程的状态及其之间的相互关联
线程中共有五中状态:创建、就绪、运行、阻塞、终止,之间的关系如下图:
线程的创建方式
创建线程的方式有三种方式:继承thread类、实现Runnable接口,实现Callable接口三种方式
1.继承Thread类
Thread类本质上是一个实现了Runnable接口的一个实例。写一个类,继承Thread类,然后重写run()方法,然后启动该类的方法就是通过Thread.start()发放进行线程的启动,会启动一个新的线程,然后执行run()方法,示例如下:
public class ThreadDemo1 {
public static void main(String[] args) {
T1 t1 = new T1();
t1.start(); //用于线程的启动
//System.out.println(t1.getName().toString());
}
}
/*
* 线程的创建
*/
class T1 extends Thread{
@Override
public void run() {
System.out.println("线程1启动了");
}
}
Thread类中部分线程分析
class Thread implements Runnable { //Thread类也是实现了Runnable接口,
/* What will be run. */
private Runnable target;
@Override
public void run() {
if (target != null) {
target.run();
}
}
public synchronized void start() { //start()方法 加同步代码块保证线程安全
/*判断线程状态,threadStatus != 0表示线程已经启动 则不能够重复启动,直接抛出 IllegalThreadStateException()*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
private native void start0();
}
2通过实现Runnable
在java中允许是但继承,多实现,有时候已经继承了一个父类,那么只能通过实现接口来实现线程的创建,在实际开发中也经常使用这种方式
public class ThreadDemo2 {
public static void main(String[] args) {
//线程的启动 也可以直接通过匿名内部类的形式进行是实现
Thread thread1 = new Thread(new T2());
thread1.start();
}
}
class T2 implements Runnable{ //线程的创建
@Override
public void run() {
System.out.println("执行T2线程");
}
}
3通过实现Callable接口进行实现
public class ThreadDemo3 {
public static void main(String[] args) throws Exception {
/*
* ExecutorService 执行器服务器
* Executors 执行器工具类
* newCachedThreadPool 缓存线程池
*/
ExecutorService es = Executors.newCachedThreadPool();
Future<String> submit = es.submit(new T3());
es.shutdown(); //关闭线程池
System.out.println(submit.get());
}
}
class T3 implements Callable<String>{
@Override
public String call() throws Exception {
String str = "线程T3执行";
return str;
}
这种方法启动线程时,通过线程池进行启动。