首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java学习笔记(基础篇)—线程

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

原创
作者头像
chlinlearn
修改2019-07-26 18:20:42
4390
修改2019-07-26 18:20:42
举报
文章被收录于专栏:java老实人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关键字,关于具体的使用和细节,后续会专门推出一篇文章来讲。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、线程与进程
  • 二:线程的三要素
  • 三:使用线程
  • 四:为什么要有两种方式
  • 五:线程的状态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档