JAVA基础之多线程

线程

  • 为什么要让run()方法自动开启

cpu有随机性,线程抢到cpu,才能干活,所以run()方法必须通过strat()方法自动启动,这样cpu就获得了一个信号,知道该线程可以抢占cpu资源;

  • 手动运行垃圾回收器

原理:当执行gc是,会触发垃圾回收机制,开启垃圾回收线程,执行finalize方法

cpu的特性:多个线程之间是抢cpu的关系,cpu有随机性

主函数结束,主任务区结束,主线程随着任务的结束而结束,线程随着任务的开始而开始

  • 创建线程

默认情况下,主线程和垃圾回收线程都是由系统创建

①用Thread创建线程对象

Thread thread1=new Thread(); //只是创建Thread对象

thread1.start(); //开启线程

Thread类里的run()方法默认是空的,所以start()方法执行结果

所以需要继承Thread类 重写run()方法

若run()方法直接被手动调用,run()对应的线程跟调用该方法所在的线程对应

Thread类实现了Runnable接口,Runnable接口里面只有run()方法,Thread类里实现的run()方法也只是空方法体,需要被继承去重写

创建一个A类实现Runnable接口,重写run()方法

A a=new A();

Thread to=new Thread(A);

to.start();

  • 给某个方法的线程冲突部分加锁

锁的条件

①锁必须是对象

②要被所有的线程共享

  • 同步代码块

synchronized(this){代码块}

  • 同步函数

非静态 public synchronized void xxx(){} //默认的锁是thissynchronized(this)

静态 public synchronized static void xxx(){} //默认的锁是当前类的字节码文件 synchronized(xx.class)

  • notify(终止线程休眠) wait(线程休眠,不可以抢占cpu)

wait()–>必须在同步环境中使用,必须使用锁调用,执行这行代码,对应的是哪个线程,就

notify()–>唤醒的是同一把锁下的线程,

Lock(显示同步) 替换 Synchronized(隐式同步)

//创建锁对象 Lock lock=new ReentrantLock();

//用于生产任务的Condition

Condition proCon = lock.newCondition();

//用于结束任务的condition

Condition conCon = lock.newCondition();

//开启锁

lock.lock();

proCon.await();

conCon.signal();

conCon.await();

proCon.signal();

//关闭所

lock.unlock();

  • 守护线程

当程序调用setDaemon方法时,并且将参数设置成true,当前线程就变成了了守护线程,只要主线程结束,该守护线程就会结束,这个方法一定要在start前调用

join()方法,优先级高于主线程,主线程会等当前的线程执行完后再去执行;该方法是在start之后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值