cpu核心数和线程数的欢喜
- 核心数:线程数 = 1:1。 使用了超线程技术后 --> 1:2
cpu时间偏轮转机制
- 又称RR调度,会导致上下文切换
什么是进程和线程
- 进程:程序运行资源分配的最小单位,一个进程内部有多个线程,会共享这个进程的资源
- 线程:cpu调度的最小单位,必须依赖进程而存在
并行、并发
- 并行:同一时刻,可以同时处理事情的能力
- 并发:与单位时间有关,在单位时间内可以处理事情的能力
并发好处和问题
- 好处:充分利用cpu资源、加快用户响应的时间,程序模块化,异步化
- 问题:
1. 线程共享资源,存在冲突;
2. 容易导致死锁;
3.启用太多线程,就有搞垮机器的可能;
新启线程的方式(3种)
- 继承Thread 重写run方法
public class NewThread {
static class StartThread extends Thread {
@Override
public void run() {
System.out.println("extends Thread");
}
}
public static void main(String []args) {
Thread thread = new StartThread();
thread.start();;
}
}
- 实现 Runnable接口 实现run方法
public class NewThread {
static class StartThread implements Runnable {
@Override
public void run() {
System.out.println("implements Runnable");
}
}
public static void main(String []args) {
Thread thread = new Thread(new StartThread());
thread.start();;
}
}
- 实现Callable接口的call方法
这个和runnable区别是可以得到返回值的,可通过
featureTask.get()
取到
因为Thread方法没有接收callable的构造方法,
public class FutureTask<V> implements RunnableFuture<V>
,
public interface RunnableFuture<V> extends Runnable, Future<V>
所以 我们可以拿 FutureTask 包装一下 Callable 然后传给Thread
public class NewThread {
//有返回值
static class StartThread implements Callable<String> {
@Override
public String call() throws Exception {
return "implements Callable";
}
}
public static void main(String []args) throws ExecutionException, InterruptedException {
FutureTask <String> featureTask = new FutureTask<>(new StartThread());
Thread thread = new Thread(featureTask);
thread.start();
System.out.print(featureTask.get());
}
}
- 线程安全的停止
线程自然终止,自然执行完或抛出未处理异常
stop会导致线程不会正确释放资源
、resume()、supend()容易导致死锁
已经不建议使用
- java线程是协作式,而非抢占式
- 调用一个线程的interrupt()方法,并不是强行关闭这个线程,只是跟这个线程打个招呼,将线程的终端标志为true,线程是否终端,还是要由线程本身决定
- 方法如果抛出InterruptedException,线程的终端标志位会被复位成false,如果确实是需要终端线程,要求我们自己在catch语句块里再次调用interrupt()
网友评论