一、基本概念:
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
多进程是指操作系统能同时运行多个任务(程序)。
多线程是指在同一程序中有多个顺序流在执行。
二、实现:
1、继承Thread类:
Thread类是在java.lang类包中定义的,继承Thread类必须重写run()方法
定义格式:class className extends Thread{ run(){}; }
class MyThread extends Thread{
private String name;
public MyThread(String name) {
this.name=name;
}
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(name+":"+i);
}
super.run();
}
}
public class ThreadDemo0{
public static void main(String args[]) {
MyThread thread =new MyThread("A");
thread.start();
}
}
说明:程序启动运行main时候,Java虚拟机启动一个进程,主线程main在main()调用时被创建,随着调用thread对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。【start()方法的调用后不是立即执行多线程代码,而是使得该线程变为为可运行态,什么时候运行是有操作系统决定的~乱序执行,只有乱序执行的代码才有必要设计为多线程】
2、实现Runnable接口
public class MyRunnable implements Runnable { private String name; public MyRunnable(String name) { this.name=name; } @Override public void run() { for (int i = 0; i <1000; i++) { System.out.println(name+":"+i); } } }
public class ThreadDemo { public static void main(String[] args) { MyRunnable r1 = new MyRunnable("A"); MyRunnable r2 = new MyRunnable("B"); //Runnable不存在start()启动方法,故也需要定义Thread Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); t1.start(); t2.start(); } }
说明:在启动的多线程的时候,需要想通过Thread类的构造函数Thread(Runnable target)构造出对象,然后调用Thread对象的start()方法来运行多线程代码。
两者都是通过Thread的对象的API来控制线程的
3.区别:
如果一个类继承Thread,则不适合资源共享,但是如果实现了Runnable接口的话,则很容易实现资源共享。
...
三、状态:
创建状态:准备好了一个多线程的对象,new出了一个Thread对象
就绪状态:调用了start()方法,等待CPU进行调度(分配资源)
运行状态:执行run()方法
阻塞状态:暂时停止执行,可能将资源交给其他线程使用
终止状态(死亡状态):线程状态
四、常用函数:
五、优先级:
优先级设定并不百分百执行,只是可能性的帮助线程抢到CPU资源
推荐:Java多线程学习(吐血超详细总结)class TheRun implements Runnable{ @Override public void run() { for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); System.out.println(Thread.currentThread().getName()+":"+i); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class ThreadYouXianJi { public static void main(String[] args) { Thread t1 = new Thread(new TheRun(),"A"); Thread t2 = new Thread(new TheRun(), "B"); Thread t3= new Thread(new TheRun(), "C"); //************************8设置优先级,可能性的抢到优先级 t1.setPriority(Thread.MIN_PRIORITY); t2.setPriority(Thread.NORM_PRIORITY); t3.setPriority(Thread.MAX_PRIORITY); t1.start(); t2.start(); t3.start(); } }