java开发两年,连这些多线程知识都还没掌握,你凭什么涨薪!
2021-03-29 09:26
标签:reads 继承 线程并发 行业 over 类对象 相关 如何 进程 进程:是一个内存中运行的应用程序,有自己独立的内存空间,一个应用程序至少有一个进程,一个进程至少有一个线程; 线程: 线程是进程中的一个执行单元,是CPU调度和分派的基本单位,能独立运行的基本单位,同一进程中的多个线程之间可以并发执行。 线程调度: 分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPUde 时间 主线程: 多线程内存图解: 多个线程之间是互不影响的,因为在不同的栈空间 - Runnable接口创建多线程和继承Thread类创建多线程的区别: 3. 锁机制 频繁的创建线程和销毁线程需要消耗时间 其实就是一个容纳多个线程的容器,线程池中的线程是可以反复使用的。 java.util.concurrent.Executors static ExecutorService newFixedThreadPool(int nThreads) 创建一个线程池,使用固定数量的线程操作了共享***队列。 Future> submit(Runnable task) 提交执行一个Runnable任务并返回一个表示该任务的未来。 感谢你看到这里,文章有什么不足还请指正,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章! java开发两年,连这些多线程知识都还没掌握,你凭什么涨薪! 标签:reads 继承 线程并发 行业 over 类对象 相关 如何 进程 原文地址:https://blog.51cto.com/14801695/2528585
线程与进程
如何创建一个多线程
public class TheadTest extends Thread{
@Override
public void run() {
for (int i = 0; i
多线程的运行原理:
Thred类的常用方法
实现Runnable 接口
public class RunnableThead implements Runnable {
@Override
public void run() {
for (int i = 0; i
匿名内部类的方式实现线程的创建
@Test
public void testThread(){
new Thread("线程一"){
@Override
public void run() {
for (int i = 0; i
线程安全问题:
public class TicketThead extends Thread{
public static void saleTicket(String ThreadName){
for (int i = 10; i > 0 ; i--){
System.out.println(ThreadName+"_"+ i);
}
}
@Test
public void testTicketThrea(){
TicketThead ticketThead = new TicketThead();
new Thread("线程1"){
@Override
public void run() {
String name = getName();
ticketThead.saleTicket(name);
}
}.start();
new Thread("线程2"){
@Override
public void run() {
ticketThead.saleTicket(getName());
}
}.start();
new Thread("线程3"){
@Override
public void run() {
ticketThead.saleTicket(getName());
}
}.start();
}
}
多线程安全问题的原理分析:
4.2 线程同步技术解决线程安全问题
格式:synchronized(锁对象){
可能出现线程安全问题的代码(访问了共享数据的代码)
}
private int ticket = 100;
Object obj = new Object();
@Override
public void run() {
while (true) {
synchronized(obj){
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket--);
}
}
}
}
同步代码块的原理
public void run() {
while (true) {
saleTicket();
}
}
private synchronized void saleTicket(){
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket--);
}
}
private static /*synchronized*/ void saleTicket(){
synchronized(Runnable.class){
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket--);
}
}
}
public void run() {
while (true) {
lock.lock();
if (ticket > 0) {
try {
Thread.sleep(10);
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket--);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}
线程的状态
等待唤醒(线程之间的通信)
public static void main(String[] args) {
Object obj = new Object();
new Thread("顾客线程"){
@Override
public void run() {
synchronized (obj){
System.out.println(getName()+"告知老板要买的包子数量和种类!");
try {
obj.wait(); //释放了锁对象
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("开吃包子咯");
}
}
}.start();
new Thread("老板线程"){
@Override
public void run() {
synchronized (obj){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName()+"告知顾客包子做好了");
obj.notify();
}
}
}.start();
}
等待唤醒机制(线程间的通信)
//线程一
public class BaoZiPu extends Thread{
private BaoZi bz;
public BaoZiPu(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
synchronized (bz){
if (bz.flag == true){
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (bz.flag == false){
bz.name = "叉烧包";
System.out.println(getName() + ":" + "开始生产"+bz.name+"包子");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("生产好了包子");
bz.flag = true;
bz.notify();
}
}
}
//线程二
public class Consumer extends Thread {
private BaoZi bz;
public Consumer(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
synchronized (bz){
if (bz.flag == false){
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (bz.flag == true){
System.out.println( getName() + ":" + "开吃" + bz.name + "包子!");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("包子吃完了!");
bz.notify();
bz.flag = false;
}
}
}
}
//
BaoZi bz = new BaoZi();//传入的锁对象是同一个
new BaoZiPu(bz).start();
new Consumer(bz).start();
线程池:
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new RunnableThead());
最后
下一篇:SpringBoot
文章标题:java开发两年,连这些多线程知识都还没掌握,你凭什么涨薪!
文章链接:http://soscw.com/index.php/essay/69453.html