1、进程:正在运行的程序
是系统进行资源分配和调用的独立单位
每一个进程都有它自己的内存空间和系统资源
2、线程是进程中的单个顺序控制流,是一条执行路径
单线程 即一个控制流,多线程即多个控制流
定义一个类继承Thread类
在类中重写run()方法
创建类的对象
启动线程
代码示例
public class ThreadDemo extends Thread{ @Override public void run() { for (int i = 1;i < 20;i++){ System.out.println(getName()+":"+i); } } public static void main(String[] args) { ThreadDemo threadDemo1 = new ThreadDemo(); ThreadDemo threadDemo2 = new ThreadDemo(); threadDemo1.setName("线程1"); threadDemo2.setName("线程2"); System.out.println(threadDemo1.getPriority()); System.out.println(threadDemo2.getPriority()); threadDemo2.setPriority(6); threadDemo1.start(); threadDemo2.start(); System.out.println(Thread.currentThread().getName()); } }
注意:
利用getName()即可获取到线程的名称,未继承Thread的使用Thread.currentThread().getName()获取线程名称
.setName("")可设置线程名称
1、分时调度 所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
2、抢占调度 优先让优先级高的线程使用CPU,如果线程的优先级相同会随机选择一个
代码示例
public class RunnableDemo implements Runnable { @Override public void run() { for (int i = 1;i < 100;i++){ System.out.println(i); } } public static void main(String[] args) { RunnableDemo runnableDemo = new RunnableDemo(); Thread thread1 = new Thread(runnableDemo,"线程1"); Thread thread2 = new Thread(runnableDemo,"线程2"); thread1.start(); thread2.start(); } }
示例代码
public class CallableDemo implements Callable { //1)重写抽象方法call方法 @Override public Integer call() throws Exception { int result = new Random().nextInt(100); System.out.println("执行子线程完成某次计算,结果为"+result); return result; } public static void main(String[] args) throws ExecutionException, InterruptedException { //2)创建Callable接口实现类对象 CallableDemo callableDemo = new CallableDemo(); //FutureTask实现了RunnableFuture接口,RunnableFuture继承了Runnable接口,FutureTask接口就是Runnable接口的实现类 FutureTask<Integer> task = new FutureTask<>(callableDemo); Thread thread1 = new Thread(task); //线程池:省去了创建线程、释放线程的时间 //3)开启新的线程 thread1.start(); System.out.println("result="+task.get()); } }