共计 2351 个字符,预计需要花费 6 分钟才能阅读完成。
线程的概述
过程: 计算机中特定性能的程序在数据集上的一次运行
线程: 计算机过程的一个单元
多线程: 一个过程有多个线程在同时运行
jvm: jvm 是多线程的, 在咱们运行 jvm 的时候后盾会运行垃圾回收的线程, 来清理没有被援用的对象
过程与线程的区别:
过程之间相互隔离, 不共享数据
同一个过程的线程之间能够共享数据
线程的实现
创立新执行线程有两种办法
一种办法是将类申明为 Thread 的子类. 该子类应重写 Thread 类的 run 办法. 接下来能够调配并启动该子类的实例.
线程启动的时候应用线程的 start 办法而不是 run
继承 Thread 类
1. 子类重写父类中的 run 办法, 将线程运行的代码寄存在 run 中, 即: 线程体
2. 建设子类对象的同时线程也被创立
3. 通过调用 start 办法开启线程
class MyThread extends Thread{
public void run(){
// 业务逻辑 , 线程体
}
}
public class ThreadDemo{
public static void main(String[] args){
new MyThread().start();
new MyThread().start();
}
}
另一种办法是申明实现 Runnable 接口的类. 该类而后实现 run 办法, 而后能够调配该类的实例, 在创立 Thread 时作为一个参数来传递并启动.
实现 Runnable 接口
- 自定义类实现接口中的 run 办法。
- 通过 Thread 类创立线程,并将实现了 Runnable 接口的子类对象作为参数传递给 Thread 类的构造方法
3.Thread 类对象调用 start 办法开启线程
class MyThread implements Runnable{
public void run(){
// 业务逻辑 , 线程体
}
}
pulbic class ThreadDemo{
public static void main(String[] args){
MyThread t1 = new MyThread();
new Thread(t1).start();
new Thread(t1).start();
}
}
线程根本罕用操作
获取线程名字: getName()
获取 main 办法所在线程名字:Thread.currentThread().getName()
设置线程名字: 对象.setname()
设置优先级: 对象.setPriority()
线程的退出: 对象.join() // 执行完之后, 再执行其余过程
线程的谦让: Thread.yield()
线程的管制: 对象.setDaemon(boolean on)
线程的终止: 对象.stop() // 已过期
对象.interrupt() // 举荐应用
线程执行原理
线程的并发执行是通过多个线程一直的切换 CPU 的资源, 这个速度是十分快的, 咱们感觉不到, 咱们能感知到的是多个线程在并发的执行.
线程的生命周期
新建: 线程被 new 进去
准备就绪: 线程具备执行的资格, 即线程调用了 start(), 没有执行的权力
运行: 具备执行的资格和具备执行的权力
阻塞: 没有执行的资格和执行权力
销毁: 线程的对象变成了垃圾, 开释资源
并发
互联网的我的项目中存在着大量的并发的案例, 如卖火车票, 电商网站.
范例: 火车找有 100 张票,4 个窗口同时买票
剖析: 4 个窗口是 4 个线程同时在运行,100 张票是 4 个线程的共享资源
采纳继承 Thread 来实现, 针对线程的平安问题, 咱们须要应用同步 (就是要加锁, 共享资源智能一个人同时拜访) 锁.
语法:
synchronized(锁对象){
// 操作共享资源的代码
}
同步代码加在什么中央?
1. 代码被多个线程拜访
2. 代码中有共享的数据
3. 共享数据被多条语句操作
package com.czz.test01;
public class SaleTicket extends Thread{
private String name ;
public SaleTicket(String name) {
super (name);
}
// 加上 static, 表明 100 张票是共享的数据
private static int tickets = 100;
// 同步锁对象
private static Object obj = new Object ();
@Override
public void run() {
while (true ) {
// 同步代码块
synchronized (obj) {
if (tickets > 0) {
System. out .println(this .getName() + ” 正在卖第 ” + tickets — + ” 张票 ”);
} else {
System. out .println(” 票已售罄 ”);
break ;
}
}
}
}
}
测试对象
package com.czz.test01;
public class TicketTest {
public static void main(String[] args ) {
SaleTicket st1 = new SaleTicket(” 窗口 1″);
SaleTicket st2 = new SaleTicket(” 窗口 2″);
SaleTicket st3 = new SaleTicket(” 窗口 3″);
SaleTicket st4 = new SaleTicket(” 窗口 4″);
st1 .start();
st2 .start();
st3 .start();
st4 .start();
}
}