核心数:线程数=1:1 ;使用了超线程技术后---> 1:2java
又称RR调度,会致使上下文切换编程
进程:程序运行资源分配的最小单位,进程内部有多个线程,会共享这个进程的资源安全
线程:CPU调度的最小单位,必须依赖进程而存在。并发
并行:同一时刻,能够同时处理事情的能力异步
并发:与单位时间相关,在单位时间内能够处理事情的能力ide
好处:充分利用cpu的资源、加快用户响应的时间,程序模块化,异步化模块化
存在问题:高并发
线程共享资源,存在冲突;spa
容易致使死锁;操作系统
启用太多的线程,就有搞垮机器的可能
一、新启线程的方式
三种实现方式
继承类Thread
实现接口Runnable
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * @Auther: BlackKingW * @Date: 2019/4/14 12:09 * @Description: */ public class NewThread { /*继承自Thread类*/ private static class UseThread extends Thread{ @Override public void run() { System.out.println("I am extends Thread"); } } /*实现Runnable接口*/ private static class UseRun implements Runnable{ @Override public void run() { System.out.println("I am implements Runnable"); } } /*实现Callable接口,容许有返回值*/ private static class UseCall implements Callable<String>{ @Override public String call() throws Exception { System.out.println("I am implements Callable"); return "CallResult"; } } public static void main(String[] args) throws InterruptedException, ExecutionException { UseThread useThread = new UseThread(); useThread.start(); UseRun useRun = new UseRun(); new Thread(useRun).start(); Thread t = new Thread(useRun); t.interrupt(); UseCall useCall = new UseCall(); FutureTask<String> futureTask = new FutureTask<>(useCall); new Thread(futureTask).start(); System.out.println(futureTask.get()); } }
一、线程天然终止:天然执行完或抛出未处理异常
二、stop(),resume(),suspend()已不建议使用,stop()会致使线程不会正确释放资源,suspend()容易致使死锁。
三、使用interrupt()方法
java线程是协做式,而非抢占式
调用一个线程的interrupt() 方法中断一个线程,并非强行关闭这个线程,只是跟这个线程打个招呼,将线程的中断标志位置为true,线程是否中断,由线程自己决定。
isInterrupted() 断定当前线程是否处于中断状态。
static方法interrupted() 断定当前线程是否处于中断状态,同时中断标志位改成false。
方法里若是抛出InterruptedException,线程的中断标志位会被复位成false,若是确实是须要中断线程,要求咱们本身在catch语句块里再次调用interrupt()。
代码以下
import java.util.concurrent.ExecutionException; /** * @Auther: BlackKingW * @Date: 2019/4/14 12:09 * @Description: */ public class DaemonThread { private static class UseThread extends Thread { @Override public void run() { try { while (!isInterrupted()) { System.out.println(Thread.currentThread().getName() + " I am extends Thread."); } System.out.println(Thread.currentThread().getName() + " interrupt flag is " + isInterrupted()); } finally { System.out.println("...........finally"); } } } public static void main(String[] args) throws InterruptedException, ExecutionException { UseThread useThread = new UseThread(); useThread.start(); Thread.sleep(5); useThread.interrupt(); } }
线程只有5种状态。整个生命周期就是这几种状态的切换。
run()和start() :run方法就是普通对象的普通方法,只有调用了start()后,Java才会将线程对象和操做系统中实际的线程进行映射,再来执行run方法。
yield() :让出cpu的执行权,将线程从运行转到可运行状态,可是下个时间片,该线程依然有可能被再次选中运行。
取值为1~10,缺省为5,但线程的优先级不可靠,不建议做为线程开发时候的手段
和主线程共死,finally不能保证必定执行,可使用
Thread.setDaemon(true);
方法将线程设置为守护线程。