JAVA学习线程的随笔

程序
进程
线程
多线程实现的两种方式:
1.自定义一个线程类, extends Thread
重写 run 方法
创建自定义的线程对象
开启线程 start()
2.自定义一个任务类, implements Runnable
重写 run 方法
创建自定义的任务对象
通过任务对象, 构造一个线程对象
开启线程 start()
(也可以使用两种方式的匿名内部类改写 )
注意:
1.不是哪个线程先start, 就先执行哪个线程,
线程的执行顺序, 是不固定的

线程Thread的构造方法:
1.new 自定义线程类(): 自定义类的构造方法, 随意
2.new Thread(): 无参构造器
3.new Thread(String): String->指定的线程名
4.new Thread(Runnable): Runnable->线程任务
5.new Thread(Runnable, String): Runnable->线程任务, String->指定的线程名

线程Thread常用API:
1.static Thread currentThread(): 获得当前正在执行的线程对象
2.String getName(): 获得线程对象的名字, 线程在创建时可以指定名字, 也可以默认分配名字
3.int getPriority(): 返回此线程的优先级
void setPriority(int): 设置线程的优先级
4.boolean isDaemon(): 测试这个线程是否是守护线程
void setDaemon(boolean): 设置这个线程是守护线程
5.static void sleep(long): 线程休眠指定时间
会有一个已检查异常, 所以必须要 try-catch
6.void join(): 等待调用这个方法的线程结束, 再继续后续代码
会有一个已检查异常, 所以必须要 try-catch
7.static void yield(): 主动放弃cpu的时间片

优先级: 1~10
改变CPU分配时间片的概率(不增加速度)
守护线程 - 前台线程
当所有的前台线程结束, 守护线程也会自动结束
GC 就是守护线程
线程同步 - 多个线程, 共享资源
1.synchronized: 同步锁, 只能同时被一个线程持有,
当线程执行完这个方法, 才会将锁释放
加到方法上, 同步方法锁
加到代码上, 借助对象, 通常是this,
确保同步的线程, 对象共享即可
2.Lock - 接口
实现类: ReentrantLock lock = new ReentrantLock();
加锁: 锁对象.lock();
解锁: 锁对象.unlock();
线程状态:
1.new - 对象
2.start() -> 就绪状态/可执行状态 Runnable
3.cpu分配时间片 -> 运行状态 running
4.run方法结束 -> 死亡状态/被终止
5.run->就绪状态: 时间片到期/yield()
6.run->阻塞状态
1.锁阻塞: 同步锁
2.计时等待: sleep(long) wait(long)
3.无限等待: wait()
唤醒: notify() notifyAll()
4.a.join(): 调用这个方法的线程进入阻塞

线程通信: 两个线程有共享数据, 线程之间有动作交互
wait()
notify()
notify() - 每次只能唤醒一个线程, 只能唤醒等待时间久的那个线程
notifyAll() - 唤醒所有正在等待的线程
wait() -> 只能被notify() 或者 notifyAll() 唤醒
wait(long) -> 到时间以后, 自动醒来

线程池: Executors 工厂类中的方法
newCachedThreadPool(): 创建一个根据需要创建新线程的线程池,但在可用时将重新使用以前构造的线程。
newFixedThreadPool(int nThreads): 创建一个线程池,该线程池重用固定数量的从共享无界队列中运行的线程。
newScheduledThreadPool(int corePoolSize): 创建一个线程池,可以调度命令在给定的延迟之后运行,或定期执行。
newSingleThreadExecutor(): 创建一个使用从无界队列运行的单个工作线程的执行程序。
线程池执行任务的API:
1.submit(Runnable/Callable)
2.execute(Runnable)

Callable(线程任务, 只能用在线程池) -> Runnable
new Thread(new Runnable(){});
new Thread(new Callable(){}); / / — 错误的!!

Callable对象只能在 : Future f = pool.submit(Callable);
f.get() -> 得到call方法的返回值
可能会遇到阻塞
f.get(long, TimeUnit.xx) -> 超时继续

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值