国外校园网站网站建设发展历程,网站模板开发主要作用,wordpress 添加链接,vs2010怎么做网站前台1.什么是JUC
java.util工具包、包、分类 业务#xff1a;普通业务线程代码 Thread Runable: 没有返回值、效率相比Callable相对较低。
2.线程和进程 进程#xff1a;一个程序#xff0c;QQ.exe Music.exe 程序的集合 一个进程往往可以包含多个线程#xff0c;至少包含一个…1.什么是JUC
java.util工具包、包、分类 业务普通业务线程代码 Thread Runable: 没有返回值、效率相比Callable相对较低。
2.线程和进程 进程一个程序QQ.exe Music.exe 程序的集合 一个进程往往可以包含多个线程至少包含一个
java默认有几个线程2个 main GC 线程开了一个进程Typora写字自动保 存线程负责 对于java而言Thread、Runable、Callable
**java可以开启线程吗**不可以本地方法底层Cjava无法操作硬件 并发、并行 并发多线程操作同一个资源
并行多个人一起走
CPU多核多线程可以同时执行线程池
并发编程的本质充分利用CPU资源
3.Synchronized和Lock Synchronized和Lock的区别 Synchronized内置的Java关键字Lock是一个Java类Synchronized无法判断获取锁的状态Lock可以判断是否获取到了锁Synchronized会自动释放锁Lock必须手动释放锁如果不释放锁就会–死锁Synchronized线程1获得锁、阻塞、线程2等待傻傻的等Lock锁就不一定等待下去。Synchronized可重入锁不可以中断的非公平Lock可重入锁可以判断锁非公平可以自己设置。Synchronized适合锁少量的代码同步问题Lock适合锁大量的同步代码。
4.生产者和消费者 传统的生产者和消费者的问题、防止虚假唤醒 线程也可以唤醒而不会被通知、中断或超时即所谓虚假唤醒
if语句只能判断一次在等待的时候如果另一个线程修改了数据那么wait后就不会进行if判断了
public class A {public static void main(String[] args) {Data data new Data();new Thread(()-{for (int i 0; i 5; i) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},A).start();new Thread(()-{for (int i 0; i 5; i) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},B).start();new Thread(()-{for (int i 0; i 5; i) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},C).start();new Thread(()-{for (int i 0; i 5; i) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},D).start();}
}
class Data{private int number0;public synchronized void increment() throws InterruptedException {//这里使用while循环如果使用if判断会出现虚假幻想的现象while (number!0){this.wait();}number;System.out.println(Thread.currentThread().getName()number);this.notifyAll();}public synchronized void decrement() throws InterruptedException {//同理while (number0){this.wait();}number--;System.out.println(Thread.currentThread().getName()number);this.notifyAll();}
} Lock锁实现生产者消费者的问题Condition实现精准通知唤醒 import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class C {public static void main(String[] args) {Data3 data new Data3();new Thread(()-{for (int i 0; i 5; i) {data.printA();}},A).start();new Thread(()-{for (int i 0; i 5; i) {data.printB();}},B).start();new Thread(()-{for (int i 0; i 5; i) {data.printC();}},C).start();}
}
class Data3{private int number1;Lock locknew ReentrantLock();Condition condition1lock.newCondition();Condition condition2lock.newCondition();Condition condition3lock.newCondition();public void printA(){lock.lock();try {while (number!1){//等待condition1.await();}System.out.println(Thread.currentThread().getName()number);number2;//唤醒所有线程condition2.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void printB(){lock.lock();try {while (number!2){//等待condition2.await();}System.out.println(Thread.currentThread().getName()number);number3;//唤醒所有线程condition3.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void printC(){lock.lock();try {while (number!3){//等待condition3.await();}System.out.println(Thread.currentThread().getName()number);number1;//唤醒所有线程condition1.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}