Java多线程
Posted 菜菜小谭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程相关的知识,希望对你有一定的参考价值。
**************************线程打断*********************************
线程运行的时候,有4种中断线程执行的方式
1. interrupt()
t1.interrupt();//中断线程的执行
泼凉水式的打断
2. stop();
一棒子打死
t1.stop();//线程直接关闭 一般不推荐使用这个方法 除非线程实在关闭不了 再调用
3. return
run()方法里面 使用return 结束该方法
run()方法结束了 线程就结束了
4. 主线程中 控制子线程结束
*********************如何解决同步问题(面试题)*********************
一.同步方法
pubilc synchronized test(){
}
二.同步代码块
//this 叫做同步监视器
synchronized(this){
三.同步锁
private ReentrantLock lock = new ReentrantLock();
lock.lock();
try{
//访问共享资源的代码
}finally{
lock.unlock();
}
演示代码:
package com.chapter14.演示同步问题;
import java.util.concurrent.locks.ReentrantLock;
//使用第二种方式 如果两个线程对象 使用的都是同一个Runnable对象 数据是可以共享的
public class MyRunnable implements Runnable {
private ReentrantLock lock = new ReentrantLock();
private int sum = 8000;
@Override
public void run() {
withdraw();
}
// 一.同步方法
// 在方法上加了一把锁
// 以this为锁 1 开
public void withdraw() {
// 1---------->0 锁上
System.out.println("withdraw");
lock.lock();
try {
if (5000 <= sum) {
// 模拟时间片恰好使用完毕的情况
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
sum = sum - 5000;
System.out.println("吐5000");
System.out.println("您的余额是:" + sum);
} else {
System.out.println("余额不足");
}
} finally {
lock.unlock();
}
// 0-------------->1打开
}
public static void main(String[] args) {
// 二.
MyRunnable r = new MyRunnable();
Thread t1 = new Thread(r, "线程1");
Thread t2 = new Thread(r, "线程2");
t1.start();
t2.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
一.为什么用线程池
1.提高程序的执行效率
创建、销毁线程开销比较大、比较浪费时间,因为要和操作系统交互...
当程序中有大量 短时间的线程任务时,大量的时间都耗费在 创建和销毁线程上,效率很低 如何解决?
使用线程池
2.控制线程对象的数量
如果一个用户过来就启动一个线程 1000W个用户过来 JVM中中有1000W个线程 很容易造成系统崩溃
二.什么线程池
应用程序在启动的时候, 事先创建n个线程对象 把这些线程对象 放到一起 组成线程池
用户需要执行线程任务的时候 不需要重新 创建线程 只需要从线程池中取出一个线程对象
然后在该线程对象上 执行线程任务即可,执行完毕以后 也不需要销毁 直接归还到线程池中
这样就大大减少了创建和销毁线程所用的时间,提高了效率
三.
Executors
**********************JDK8的线程池新特性--用于提高多核CPU的能力 ForkJoinPool*************
原理: 把一个大任务分解成若干个小任务,每个小任务交给一个CPU执行,执行完毕以后把结果合并统一返回
需求1: 打印0-999
不带返回值的任务
需求2: 带返回值的任务
以上是关于Java多线程的主要内容,如果未能解决你的问题,请参考以下文章