码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程(二)

时间:2018-11-05 01:16:06      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:exce   需要   共享   run   stat   打开   用户   资源   推荐   

**************************线程打断*********************************

线程运行的时候,有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多线程(二)

标签:exce   需要   共享   run   stat   打开   用户   资源   推荐   

原文地址:https://www.cnblogs.com/MrTanJunCai/p/9906836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!