自学笔记 (三)-- 多线程

多线程

前言 : 距离上次自学笔记还是上次,工作真是太忙了,天天只能趁着空余时间更新更新之前的笔记,想开新东西完全没时间。但是必须要补基础啦,不然以后没机会提高了,现在只能趁着晚上十一点以后有点时间更新点东西。

进程 进程是程序执行一次的过程,是一个动态的概念。是系统资源分配的单位。

线程 在一个进程中可以包含多个线程,一个进程中至少有一个线程,线程是CPU调度和执行的单位。

1、在程序运行的过程中,即使自己没有创建线程,后台也会有多个子线程,比如主线程、gc线程(垃圾回收)。
2、在一个进程中如果开辟了多个线程,线程的运行有调度器安排调度。先后顺序不能人为干预。
3、对同一份资源操作时,会存在资源抢夺的情况,需要加入并发控制。
4、每个线程在自己的工作内存交互,内存控制不当会造成数据不一致。

创建线程
**方法一:**继承thread类重写, run方法,调用start方法启动

public class TestThread extends Thread{
    @Override
    public void run() {
        super.run();
    }
}

TestThread testThread = new TestThread();
testThread.start();

**方法二:**实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法

public class TestRunnable implements Runnable {
	@Override
    public void run() {
    }
}

TestRunnable testRunnable = new TestRunnable();
Thread thread = new Thread(testRunnable);
thread.start();

获取当前执行线程

Thread.currentThread().getName()

线程拓展 --> 线程组
手册中是这么说的:线程组代表一组线程。 此外,线程组还可以包括其他线程组。 线程组形成一个树,除了初始线程组之外,每个线程组都有一个父进程。
允许线程访问有关其线程组的信息,但不能访问有关其线程组的父线程组或任何其他线程组的信息。

线程组可以简单来说是线程的分组,然后将每个分组内的数据进行统一命名。

TestGrabTickets testGrabTickets = new TestGrabTickets();

ThreadGroup threadGroup = new ThreadGroup("小组一号");
ThreadGroup threadGroup2 = new ThreadGroup(threadGroup,"小组二号");

new Thread(threadGroup, testGrabTickets, "一号").start();
new Thread(threadGroup2, testGrabTickets, "二号").start();
new Thread(testGrabTickets, "没组三号").start();

线程的五大状态
创建、就绪、阻塞、运行、死亡状态

线程的常用方法

setPriority(int newPriority)//更改线程优先级
sleep(long millis)//在指定的毫秒数内让当前正在执行的线程休眠
join()//等待该线程终止
yield()//暂停当前正在执行的线程对象,并执行其他线程

守护线程
虚拟机不用等待守护线程执行完毕

thread.setDaemon(true);//线程的这个值设置为true就编程守护线程了,先设true再开启线程

锁机制synchronized
同一个资源,被不同线程获取使用,需要加同步锁。
但是使用锁虽然会保证线程安全但是也会引发性能倒置。
通过synchronized关键字给方法加锁。

synchronized 块

synchronized (Obj){}

Obj是锁的对象,监视Obj,如果这个对象被使用,那么后续其他使用这个对象的线程就需要在获取这个对象的时候进行等待。同步块比关键字的优势是尽量减少同步锁的范围。

Lock锁
定义lock锁,显示锁

private final ReentrantLock lock = new ReentrantLock();

lock.lock();//加锁
lock.unlock();//解锁

线程池
创建几个线程放在池子中,使用时直接获取使用。 用完直接放回线程池即可。
线程池相关API:ExecutorService(线程池接口) 和 Executors(工具类、线程池工厂类)

ExecutorService service = Executors.newFixedThreadPool(10);

service.execute(new Thread());// 放入线程

//关闭连接
service.shutdown();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值