什么是JUC
JUC指的是:Java里的三个包
- java.util.concurrent
- java.util.concurrent.atomic:原子性
- java.util.concurrent.locks:lock锁
回顾线程和进程
进程
程序执行的一次过程,一个进程包含一个或多个线程。进程是资源分配的单位
线程
可以指程序执行过程中,负责实现某个功能的单位。线程是CPU调度和执行的单位
并发
同一时刻,多个线程交替执行。(一个CPU交替执行线程)
并行
同一时刻,多个线程同时执行。(多个CPU同时执行多个线程)
查询cpu核数
public class Test1 {public static void main(String[] args) {//查询cpu核数//CPU 密集型,IO密集型System.out.println(Runtime.getRuntime().availableProcessors());}
}
并发编程的本质
并发编程的本质是充分利用cpu资源。
问题:Java真的可以开启线程吗
不可以。Java创建Thread类调用start方法,底层是把线程放到一个组里面,然后调用一个本地方法start0;方法底层是C++;Java无法操作硬件。
Thread部分源码
public synchronized void start() {/*** This method is not invoked for the main method thread or "system"* group threads created/set up by the VM. Any new functionality added* to this method in the future may have to also be added to the VM.** A zero status value corresponds to state "NEW".*/if (threadStatus != 0)throw new IllegalThreadStateException();/* Notify the group that this thread is about to be started* so that it can be added to the group's list of threads* and the group's unstarted count can be decremented. */group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}}//本地方法,底层的C++ java无法直接操作硬件private native void start0();
多线程回顾
线程的几种状态
新生状态、运行状态、阻塞状态、等待状态(死等)、超时等待状态(过期不候)、停止状态
Thread.State的源码
public enum State {/*** Thread state for a thread which has not yet started.*/// 新生NEW,/*** Thread state for a runnable thread. A thread in the runnable* state is executing in the Java virtual machine but it may* be waiting for other resources from the operating system* such as processor.*/// 运行RUNNABLE,/*** Thread state for a thread blocked waiting for a monitor lock.* A thread in the blocked state is waiting for a monitor lock* to enter a synchronized block/method or* reenter a synchronized block/method after calling* {@link Object#wait() Object.wait}.*/// 阻塞BLOCKED,/*** Thread state for a waiting thread.* A thread is in the waiting state due to calling one of the* following methods:* <ul>* <li>{@link Object#wait() Object.wait} with no timeout</li>* <li>{@link #join() Thread.join} with no timeout</li>* <li>{@link LockSupport#park() LockSupport.park}</li>* </ul>** <p>A thread in the waiting state is waiting for another thread to* perform a particular action.** For example, a thread that has called <tt>Object.wait()</tt>* on an object is waiting for another thread to call* <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on* that object. A thread that has called <tt>Thread.join()</tt>* is waiting for a specified thread to terminate.*/// 等待,死死的等待WAITING,/*** Thread state for a waiting thread with a specified waiting time.* A thread is in the timed waiting state due to calling one of* the following methods with a specified positive waiting time:* <ul>* <li>{@link #sleep Thread.sleep}</li>* <li>{@link Object#wait(long) Object.wait} with timeout</li>* <li>{@link #join(long) Thread.join} with timeout</li>* <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>* <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>* </ul>*/// 超时等待TIMED_WAITING,/*** Thread state for a terminated thread.* The thread has completed execution.*/// 终止TERMINATED;}
sleep和wait的区别
- sleep是Thread类的本地方法;wait是Object类的方法。
- sleep不释放锁;wait释放锁。
- sleep可以使用在任何地方;wait必须在同步代码块中
- sleep不需要和synchronized关键字一起使用;wait必须和synchronized代码块一起使用。
- sleep不需要被唤醒(时间到了自动退出阻塞);wait需要被唤醒。
- sleep一般用于当前线程休眠,或者轮循暂停操作;wait则多用于多线程之间的通信。
- sleep和wait都需要捕获异常