Java学习笔记(基础篇)—线程

一、线程与进程

线程是程序执行的最小单位,是动态的。
进程是系统进程资源分配和系统调度的最小单位,是动态的。
线程和进程的目的:多任务—>效率高

同时性

在同一个时间点只能执行一个进程或线程
在同一个时间段可以执行多个进程或线程

多进程的数据不共享,每个进程都有自己的独立内存空间。多线程数据的进程的数据是共享的,每一个线程又有自己独立堆栈区空间。线程与线程之间是独立的,相互之间不受影响。

一个程序可以启动多个进程
一个进程可以启动多个线程
线程必须通过进程启动,不能独立存在的。

.class运行在JVM上,.class就是一个一个的线程。JVM就是一个进程。

二:线程的三要素

CPU:

运行线程,所有线程共享CPU。只有线程抢占CPU成功才会执行。

代码:

线程运行过程中执行的代码块。线程启动之后会执行public void run()的方法。

数据:

​ 1)局部变量是多线程不共享
​ 2)extends Thread方式实现多线程,静态变量是共享,实例变量不共享
​ 3)implements Runnable方式实现多线程,静态变量是共享的,实例变量也共享

三:使用线程

第一种方式:
class MyThread extends Thread{
    public void run(){
    }
}

建线程:Thread t1=new MyThread();
//不要t1.run()来企图启动线程,那是单纯的调用该方法,并没有启动一个线程
启动线程: t1.start();
第二种方式:
class MyThread implements Runnable{
    public void run(){
    }
}
创建线程:MyThread m=new MyThread();
    Thread t1 = new Thread(m);
启动线程: t1.start();
Thread类中的方法:

getName(): 获取当前线程的名字
static sleep(long): 强制当前正在执行的线程休眠(暂停执行),只是让出CPU,但不会释放锁。
static currentThread(): 获取当前正在执行的线程。

Thread类中的方法:
getName():获取当前线程的名字
static sleep(long):强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。
static currentThread():获取当前正在执行的线程。

注意:

线程的运行时抢占式,所以线程的执行结果是不可预知的。

四:为什么要有两种方式

java单继承

class Test extends Student implements Runnable{
} 

五:线程的状态

a)新建状态(new):线程对象已经创建,还没有在其上调用start()方法。

b)就绪状态(Runnable): 线程已经准备好了,等待CPU的调度,当线程有资格行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入就绪状态。在线程运行之后或者从阻塞、等待或睡眠状态回后,也返回到就绪状态。就绪状态维护了一个线程池。 所有的就绪状态的线程都会进入到线程池中。

c)运行状态(Running):线程调度程序从可运行池中选择一个线程作为 当前线程时线程所处的状态。这也是线程进入 运行状态的唯一一种方式。CPU正在执行的线程。

d)等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到就绪状态。

e)死亡状态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

六:中断线程:让线程正常结束,到死亡状态

1)使用标志变量中断线程。就好像开车一样。
2)使用stop()已经过时了,虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是不受提倡的。

Thread类中的方法:

join(): 等待线程的执行结束。在哪个线程中调用就谁等待。谁调用该方法就等待谁。
interrupt(): 中断阻塞中的线程。不能中断正在执行的线程。
isInterrupted(): 判断是否被中断
static interrupted(): 清空中断信息

七:线程的并发访问:多线程同时操作同一个对象。

synchronized(共享区){临界区}
共享区:多线程同时操作同一个对象
临界区:多线程对共享区进行操作的代码区
将所有影响的方法都定义成线程安全的方法就变成了线程安全的类。synchronized可以放在方法上,就是一个同步方法。

同步锁有很多种,这里只是简单的描述了一下synchronized关键字,关于具体的使用和细节,后续会专门推出一篇文章来讲。

欢迎访问我的腾讯云+社区:传送门


 上一篇
java学习笔记(基础篇)—IO流 java学习笔记(基础篇)—IO流
java学习笔记(基础篇)—IO流一:流的概念在Java中,把一组有序的数据序列称为流。 ​ 如a.txt的文件拷贝到b.txt中。 在Java中流是使用统一的方式操作输入和输出的数据。 从文件中读取,从键盘读取,从网络中读取…
2019-07-30
下一篇 
Java学习笔记(基础篇)—内部类 Java学习笔记(基础篇)—内部类
java学习笔记(基础篇)—内部类一、内部类1.顶层类和内部类的区别: 1)位置: 内部类是定义一个类的里面或者一个方法中,或者一个表达式中。 顶层类是定义在package下 2)修饰符:顶层类只能处于public和默认访问级别,
2019-07-23
  目录