Java多线程基础知识

多线程
进程与线程的关系:进程中包含多个线程,当进程结束时所有线程必然结束。当线程结束进程不一定结束。
并发与并行:并发是指可以运行多个线程但是每次只有一个线程在被CPU调度
并行是中可以同时运行多个线程(CPU多核)
Java中实现多线程有三种方式
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口

通过继承Thread类实现多线程步骤
1.编写类继承Thread类
2.重写run()方法
3.Start()方法启动线程

通过实现Runnable接口实现多线程步骤
1.编写类实现Runnable接口
2.重写Runnable接口中的方法
3.运用代理Thread,start()方法,启动线程

Thread类中的常用方法
static Thread currentThread() 得到当前线程
getName() 取得线程名字
setName(String name) 设置名字
int getPriority() 得到线程优先级
void setPriority() 设置线程优先级
void start() 启动线程
void run() 存放线程体代码
isAlive() 判断线程是否还“活”着,即线程是未终止

多线程的同步与死锁
多线程的同步:作用是保证共享资源在任何时间内仅被一个线程访问。
1)同步代码块:synchronized(监控器){},这里的监控器指的是共享对象
2)同步方法:在方法中使用synchronized,同步方法因为是写在方法标签中所以它的监控对象就是调用方法的对象,所以不用指出。
3)Lock锁

死锁:过多的同步就会导致死锁的发生,产生原因是因为互相等待对方的资源。

线程的通信:
通信的方法(这些方法是共享对象去使用的)

线程之间通信的方法是Object类中的方法

Final void wait() 表示线程一直等待,直到其他线程通知
Void wait(long timeout) 线程等待指定毫秒参数的时间
Final void wait(long timeout,int nanos) 线程等待指定毫秒,微妙的时间
Final void notify() 唤醒一个处于等待状态的线程
Final void notifyAll() 唤醒同一个对象上所有调用wait()方法的线程,优先级别搞的线程优先运行(这里运行顺序是不一定的只不过优先级高的容易被CPU选中而已)

【注意】:以上方法只能在synchronized同步块或者同步方法中使用。否则会抛出异常。

锁池和等待池
在java中,每个对象都有两个池,锁池和等待池

锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其他的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。

等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同是线程A就进入到了该对象的等待池中。如果另外的一个线程调用了相同对象的notifyAll()方法,那么出入该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象对象的等待池中的线程(随机)会进入该对象的锁池。

<这个地方少个图片>

第三种实现线程的方法Callable接口
特点:Callable接口可以抛异常,带返回值类型并且带有泛型。

实现步骤:
1.创建类实现Callable接口(可以带泛型,返回值也是泛型的类型)
2.重写call()方法
3.在测试类中创建实现Callable接口的对象
4.将该对象带入FutureTask类中(目的是让该对象得到get()方法,得到实现Callable接口类所改写的call()方法的返回值)
5.代理Thread,start(),启动线程
6.通过get()方法取得返回值

FutureTask类实现接口层次图
<这个地方少个图片>

线程组与线程池
线程组:对线程进行分组
统一管理:便于对一组线程进行批量管理线程或线程组对象
安全隔离:允许线程访问有关自己的线程组的信息,但是不允许它访问有关其他线程组的父线程组或其他任何线程组的信息。
在Java中如果创建一个线程,没有分组的话,那么默认就在main线程组里

线程组的简单用法
ThreadGroup tg = new ThreadGroup(“线程池一组”);
new Thread(tg,new Group()).start();
new Thread(tg,new Group()).start();
new Thread(tg,new Group()).start();

运行效果
<这个地方少个图片>

线程池:
里面有大量线程等待被使用
使用方式
{
ExecutorService service = Executors.newCachedThreadPool();
ExecutorService service1 = Executors.newFixedThreadPool(10);
ExecutorService service2 = Executors.newSingleThreadExecutor();
for (int i = 0; i < 20; i++) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+“线程开始”);
try {
Thread.currentThread().sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+“线程结束”);
}
};
// service.submit®;
// service1.submit®;
service2.submit®;
}
service2.shutdown();
}

ExecutorService service = Executors.newCachedThreadPool();//可伸缩线程池
ExecutorService service = Executors.newFixedThreadPool(10);//可指定线程个数的线程池
ExecutorService service = Executors.newSingleThreadExecutor();//只有一个线程的线程池
Service.submit(Runnable接口的实现类);启动线程池
Service.shutdown();结束线程池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值