Cathy学习Java——线程

什么是线程:线程是执行程序的一条路径,一个进程可以包含多个线程
一个应用程序可以理解成就是一个进程
多线程并发执行可以提高程序的效率,可以同时完成多项工作
多线程的应用场景:
VNC同时共享屏幕给多个电脑
迅雷开启多条线程一起下载
QQ同时和多个人一起视频
服务器同时处理多个客户端请求
多线程并行和并发的区别:
并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU)并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于间时间隔较短,使人感觉两个任务都在运行(画图-任务调度)。
Java程序运行原理和JVM的启动是多线程的吗(了解)
Java程序运行原理:
Java命令会启动java虚拟机,启动JVM, 等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个“主线程“然后主线程去调用某个类的main方法。
JVM的启动是多线程吗?
JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。
案例:多线程打印的顺序不一样,多线程是抢占资源
线程实现的方式(1) -继承Thread
使用步骤
1.定类继承Thread
2.重写run方法
3.把新线程要做的事写在run方法中
4.创建线程对象
5.开启新线程,内部会自动执行run方法
线程实现的方式(2) -定义类实现Runnable接口
使用步骤
1.定义类实现Runnable接口
2.实现run方法
3.把新线程要做的事写在run方法中
4.创建自定义的Runnable的子类对象创建Thread对象,传入Runnable
5.调用start()开启新线程,内部会自动调用Runnable的run()方法
■ 两种方式的区别(掌握)

查看源码的区别:

● 继承Thread :由于子类重写了Thread类的run(), 当调用start()时直接找子类的run()方法
实现Runnable :构造函数中传入了Runnable的引用,有个成员变量记住了它,调用run() 方法时内部判断
成员变量Runnable的引用是否为空。
■ 继承Thread
● 好处是:可以直接使用Thread类中的方法,代码简单
● 弊端是:如果已经有了父类,就不能用这种方法

■ 实现Runnable接口
● 好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,代码更灵活
● 弊端是:不能直接使用Thread中的方法,需要先获取到线程对象后,才能得到Thread的方法,代码复杂
在这里插入图片描述
获取线程名字和设置名字(掌握)

获取名字
通过getName()方法获取线程对象的名字

设置名字
通过构造函数可以传入String类型的名字
通过setName (String)方法可以设置线程对象的名字

每个线程系统都会默认分配个名字

加入线程、礼让线程、设置线程优先级(了解)
join(),当前线程暂停,等待指定的线程执行结束后,当前线程再继续
join(int),可以等待指定的毫秒之后继续
yield()让出cpu
setPriority()设置线程的优先级
同步代码块和同步方法
➢什么情况下需要同步
1.当多线程并发,有多段代码同时执行时,我们希望某一段代码执行的过程中CPU不要切换到其他线程工
作.这时就需要同步.
2.如果两段代码是同步的,那么同一时间只能执行一段,在一段代码没执行结束之前,不会执行另外一段
代码.
➢同步代码块
1.使用synchronized关键字加上一个锁对象来定义一段代码,这就叫同步代码块
2.多个同步代码块如果使用相同的锁对象,那么他们就是同步的
➢同步方法
1.使用synchronized关 键字修饰一个方法,该方法中所有的代码都是同步的
2. 非静态同步函数的锁是: this
3. 静态同步函数的锁是:字节码对象(xx. class)
锁的总结
1.锁问题:
同步中,锁最好同一个对象,如果不是同- -对象,还是会有线程安全问题
锁: this,代表当前对象
锁:如果new对象,就不是同一把锁
锁:字节码对象String.class,内存中,只有一个字节码对象
开发中:一般都是this
2.在方法内部声明synchronized的就是“同步代码块”
3.在声明方法的时候,添加synchronized, 就是同步方法
》如果是非静态方法,锁就是this
》如果是静态方法,锁就当前类的字节码对象
//TicketTask. class
public static synchronized void test1(){}
4.同步使用的建议:
同步加锁的时候,尽量让锁住的代码范围小一点,这样可以让其它线程等待时间少一点,性能高

死锁
多线程同步的时候,如果同步代码嵌套使用相同锁,就有可能出现死锁
■单例设计模式(掌握)
➢单例设计模式:保证类在内存中只有一个对象。
➢如何保证类在内存中只有一个对象呢?
(1)控制类的创建,不让其他类来创建本类的对象。private
(2)在本类中定义一一个本类的对象。Singleton s;
(3)提供公共的访问方式。public static Singleton getInstance() {return s}
➢单例写法两种:
(1)饿汉式开发用这种方式。
(2)懒汉式面试写这种方式。多线程的问题?
(3)第三种格式
➢饿汉式和懒汉式的区别
1.饿汉式是空间换时间,懒汉式是时间换空间
2.在多线程访问时,饿汉式不会创建多个对象。而懒汉式有可能会创建多个对象
■两个线程间的通信(掌握)
➢什么时候需要通信
多个线程并发执行时,在默认情况下CPU是随机切换线程的
■如果我们希望他们有规律的执行,就可以使用通信,例如每个线程执行一次打印
➢怎么通信?
如果希望线程等待,就调用wait()
■如果希望唤醒等待的线程,就调用notify();
这两个方法必须在同步代码中执行,并且使用同步锁对象来调用
■案例:线程任务的顺序执行
掌握notify和notifyA1l方法的区别
5. notify是随机唤醒一个线程
6. notifyAll是唤醒所有线程
■JDK1. 5的新特性互斥锁(掌握)
➢同步加锁
使用ReentrantLock类[互斥锁]的lock ()和unlock()方法进行同步
➢通信

使用ReentrantLock类的newCondition()方法可以获取Condition对象

需要等待的时候使用Condit ion的await()方法,唤醒的时候用signal()方法
不同的线程使用不同的Condition, 这样就能区分唤醒的时候找哪个线程了

线程的五种状态(掌握)
在这里插入图片描述
内置线程池的使用概述
■JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法
public static ExecutorServ ice newFixedThreadPool (int nThreads)
public static ExecutorServ ice newSingleThreadExecutor()
这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者
Callable对象代表的线程。它提供了如下方法
Future<?> submit (Runnable task)
Future submit (Callable task)
■使用步骤:
●创建线程池对象.
创建Runnabl e实例
提交Runnable实例
关闭线程池
线程通信的一些疑问
1.在同步代码块中,用哪个对象锁,就用哪个对象调用wait方法
2.为什么wait 方法和notify方法定义在Object这类中?
因为锁对象可以是任意对象,0bject是所有的类的基类,所以wait方法和notify方法需要定义在Object这个类中
3.sleep方法和wait方法的区别?
》sleep 方法必须传入参数,参数就是时间,时间到了自动醒来工
》wait方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不
传入参数就是直接等待
》sleep 方法在同步函数或同步代码块中,不释放锁,睡着了也抱着锁睡
》wait方法在同步函数或者同步代码块中,释放锁

线程组
1.Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java 允许程序直接对线程组进行控制。
2.默认情况下,所有的线程都属于主线程组。
3.public final ThreadGroup getThreadGroup() 通过线程对象获取他所属于的组
4.public final String getName()通过线程组对象获取组的名字
5.我们也可以给线程设置分组ThreadGroup(String name)创建线程组对象并给其赋值名字
创建线程对象:Thread(ThreadGroup?group, Runnable?target, String?name)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Casey·Hu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值