Java多线程
Posted 小田mas
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程相关的知识,希望对你有一定的参考价值。
Java多线程
JavaThread
多任务–>多线程
期望变成下图所示。
进程process与Thread
先后顺序是不能人为干预的。
同时,线程会带来额外的开销。
垃圾回收线程gc进程。
线程的创建
三种方式:
callable在工作3-5年之后在进行了解。
- 继承Thread,重写run方法。
public class TestThread extends Thread
public void run()
//run方法线程体
for(int i=0;i<20;i++)
System.out.println("我在看代码");
public static void main(String[] args)
//main线程,主线程
TestThread tt = new TestThread();
tt.start();
for(int i=0;i<20;i++)
System.out.println("我在学多线程");
注意线程开启不一定立即执行,由cpu调度执行,线程并行交替执行。
调用的是start,注意!!!
2.
实现Runnable接口
代理,需要创建一个线程对象,然后通过线程对象来开启线程。
两者的区别
由于java 是单继承,所以推荐使用Runnable接口。
Thread修改之后实现Runnable接口
小结
package caculator;
public class TestThread1 implements Runnable
private int ticketnum = 10;
@Override
public void run()
while(true)
if(ticketnum<0)
break;
try
Thread.sleep(200);
catch (InterruptedException e)
e.printStackTrace();
System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketnum--+"张票");
public static void main(String[] args)
TestThread1 ticket = new TestThread1();
new Thread(ticket,"小明").start();
new Thread(ticket,"小米").start();
new Thread(ticket,"妞妞").start();
龟兔赛跑
线程创建方式3实现callable接口。
首先实现callable接口,需要有一个返回值,<>- 重写call方法
- new类时有所不同
固定大小的线程池。
new了1个池子,这个池子里有3线程。
callable
可以定义返回值,可以抛出异常。
静态代理
真实对象和代理对象都要实现同一个接口,代理对象要代理真实角色。
通过代理角色替真实角色完成一些事。
好处:真实对象可以专注做自己的事情,而代理对象可以做很多真实对象做不了的事情。
可以将以下两个对比来看
thread代理runnable,实现start方法。
静态代理就是线程底部的实现方法。
lamda表达式
包含静态内部类的知识。
局部内部类
匿名内部类
没有类的名称,必须借助接口或者父类。但是前面还是需要加上ILike
最终采用lambda简化。
有参lambda实现
lambda表达式的简化,
去掉花括号的原因是因为代码只有一行,多行就不可以。
去掉括号的原因是前提是接口是函数式接口。
多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号,(a,b)。
线程状态
线程方法
@Deprecated,代表这个方法已经不建议使用了。
模拟网络延时,可以放大问题的发生性。
礼让不一定成功,要看cpu的心情。
Thread.currentThread.getName();
死亡之后的线程就不能再次启动了。
getstate();
线程优先级
相应的maxpriority和minpriority都对应相应的数字。
优先级要提前设定,然后再用start调度。
如果优先级低的先执行了,就会导致性能倒置。
daemon
每个对象都有一把锁。
线程同步方法
sychronized默认锁的是this,所以不太对,但是run里面有可能操作的对象不是this。此时只锁一个方法并不能达到理想的效果,所以这个时候出现了同步块。
用法可以参考以下的代码
锁的对象就是变化的量,即需要增删改的量。
测试JUC安全类型的集合。
CopyOnWriteArrayList本身就是安全的。
互斥互斥的实现。
解决互斥
操作系统有没有。
使用方法:
sychronized与lock的对比
lock是代码块锁。
ReetrantLock。
以上就是管城法。
线程池
总结
以上是进程的创建。
以上是关于Java多线程的主要内容,如果未能解决你的问题,请参考以下文章