学习高并发的前置知识——Java 中的线程基础,springcloud 实战演练
}
[](
)下面是 Thread 类
public class Thread implements Runnable {
// 大量的类和方法...
}
[](
)Runnable
public class ThreadTest {
public static class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread() + " here");
}
}
public static void main(String[] args) {
MyRunnable task = new MyRunnable();
new Thread(task).start();
new Thread(task).start(); // 可以启动多个
}
}
Runnable 接口
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
[](
)Callable FutureTask
public class ThreadTest {
public static class CallerTask implements Callable<String> {
@Override
public String call() throws Exception {
return "hello";
}
}
public static void main(String[] args) {
FutureTask<String> futureTask = new FutureTask<>(new CallerTask());
new Thread(futureTask).start();
try {
String result = futureTask.get(); // 返回结果
System.out.println(Thread.currentThread() + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
@FunctionalInterface
public interface Callable<V> {
/**
Com
putes a result, or throws an exception if unable to do so.
@return computed result
*/
V call() throws Exception;
}
public class FutureTask<V> implements RunnableFuture<V> {
// 类和方法...
}
[](
)线程中的方法
[](
)join
如果想让某几件事情做完之后再进行下面的事情,就可以用join()
方法。是Thread
中的方法。
[一起吹水聊天](
)
threadA.join(); // 当 main 线程执行到这里,会阻塞,等到 ThreadA 执行完毕后再执行 ThreadB()
threadB.join(); // 同理,会再次阻塞。
[](
)sleep
线程被阻塞,持有的锁或监视器资源不会释放,睡眠时间到了之后就会回到就绪状态,获取 CPU 后继续执行。
Thread.sleep(1000);
[](
)yield
当一个线程使用yield
方法时,暗示线程调度器当前线程要让出 CPU 资源,但是线程调度器可以忽略这个暗示。如果执行成功,线程会进入就绪状态。
[](
)线程状态
Java 中线程分为六种状态
New(新建)
Runnable(可运行)
Blocked(阻塞)
Waiting(等待)
Timed waiting(计时等待)
Terminated(终止)
Java 没有将正在运行作为一个单独的状态。一个正在运行的线程仍然处于可运行的状态。
线程调度的细节依赖于操作系统提供的服务。
[](
)New(新建)
[一起吹水聊天](
)
当用 new 操作符创建一个新线程时,如
new Thread()
;
[](
)Runnable(可运行)
一旦调用
start()
方法,线程就处于可运行状态
[](
)阻塞、等待、计时等待
当线程处于阻塞或等待状态时,它暂时是不活动的。它不运行任何代码,而且消耗最少的资源。要由线程调度器重新激活这个线程。具体细节取决于它是怎样达到非活动状态的。
当一个线程试图获取一个内部的对象锁,而且这个锁目前被其它线程占用,就会进入阻塞状态。
当线程等待另一个线程通知调度器出现一个条件时,这个线程会进入等待状态。
有几个方法有超时参数,调用这些方法会让线程进入计时等待状态。知道超时期满或接收到适当的通知。
[](
)Terminated(终止)
线程会由于以下两个原因而终止
run()
方法正常退出,线程自然终止。因为一个没有捕获的异常终止了 run() 方法,使线程意外终止。
[](
)线程中的 6 个状态
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
评论