进程和线程的区别
进程是操作系统进行资源分配的最小单位. 资源有(内存, I/O)等
线程是CPU调动执行任务的最小单位,线程必须依赖于进程存在. 一个CPU的内核可以执行一个线程。
CPU时间调度算法
一次切换线程会导致20000CPU周期, 时间调度算法在之前写过的一篇文章里有
//www.greatytc.com/writer#/notebooks/43362804/notes/61179958
并行和并发的区别(Parallel & Concurrent)
并行:同时可以进行的任务数,几个CPU可以同时几个任务,同时处理任务
并发:一个CPU在一定时间内可以完成哪几个任务。
并行/多线程的好处: 充分利用CPU资源,增加响应时间, 使代码模块化,异步化,简单化。
多线程/高并发的挑战:
1.对数据产生竞争,产生死锁,抢锁竞争
2.OS限制: 每一个线程需要栈空间(1MB),用于储存将要使用数据的指针。因此每开一个线程会消耗大量的资源. mySQL的线程在150-250之间.
新启线程的方式
private static class UseThread extends Thread{ // 对线程的抽象
@Override
public void run() {
super.run();
System.out.println("I extends thread")
}
}
private static class UseRunnable implements Runnable { // 对任务,业务逻辑的抽象
@Override
public void run() {
System.out.println("I implements Runnable");
}
}
Thread和Runnable的不同:
Thread拓展Thread类,只能拓展一次,而基于runnable的线程可以实现多个接口。
Thread属于thread,而runnable用于实现业务逻辑.
通常, 如果需要创建thread, 那就拓展thread类, 而如果需要实现业务逻辑,则实现runnable,
然后把runnable object当作参数传到不同的thread initialization中去,此时runnable中的数据在多个线程中共享。
ex.
ImplementRunnable r1 = new ImplementRunnable();
Thread t1 = new Thread(r1, "张三");
Thread t2 = new Thread(r1, "lisi");
t1.start();
t2.start();
这时候, t1和t2两个thread同时运行runnable中的逻辑,并且共享其中的数据.
如果直接运行runnable(),这样的话只会当做普通的对象方法执行,并不会创建一个新线程。也就是说程序得等到r2.run()方法执行后,才执行r1.run()。。。
FutureTask, 实现RunnableFuture的接口,
对于具体的 Runnable 或者 Callable 任务的执行结果进行取消、查 询是否完成、获取结果。
Callable和Runnable的区别
相同点: 1、两者都是接口2、两者都需要调用Thread.start启动线程
不同点:1、如上面代码所示,callable的核心是call方法,允许返回值,runnable的核心是run方法,没有返回值2、call方法可以抛出异常,但是run方法不行3、因为runnable是java1.1就有了,所以他不存在返回值,后期在java1.5进行了优化,就出现了callable,就有了返回值和抛异常4、callable和runnable都可以应用于executors。
Stop vs.Interrupt()
不建议使用:
Stop(): 不会释放线程占有资源
应该使用:
Interrupt(): 给线程打招呼,不会强制关掉线程,线程可以不理会.
在JDK中,线程是协作式的,而不是抢占式的,也可以通过isInterrupted来检查是否需要强制暂停线程。