s1.基本定义
1.1进程:正在进行中的程序。其实就是一个应用程序运行时的内存分配空间;
1.2线程:又称为轻型进程,是分配资源和程序运行的最小单位。进程负责的就是应用程序的空间标示,而线程负责的是应用程序的执行顺序。
线程的划分小于进程,线程隶属于某个进程。 进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而线程是不能占有这些资源的。 进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信比较方便。 进程在执行的过程中,包含比较固定的入口,执行顺序,出口,而线程的这些过程会被应用程序所控制。
2.在Java语言中,多线程是的机制是通过虚拟CPU实现的;通过java.lang.Thread类可以实现虚拟CPU的功能。
- 返回当前线程的名称的方法:Thread.currentThread().getName()、
- 线程的名称是由:Thread-编号定义的。编号从0开始;
- 线程要运行的代码都要统一存放在run()方法中。
- 指定start()方法开启线程(1.启动了线程 2.让JVM调用了run()方法)
3.实现多线程的方法
1.继承Thread类
2.实现Runnable接口
3.使用Executor框架来创建线程池
4.实现Callable接口
1.继承Thread类
package dong.test;
public class Test extends Thread{
Test(String name){
super(name);
}
@Override
public void run() {
for(int i=10;i>0;i--){
try {
System.out.println("left time:"+i);
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
System.out.println("game is over!");
}
public static void main(String[] args){
Test test = new Test("Thread Test");
test.start();//启动线程
}
}
运行结果:
left time:10
left time:9
left time:8
left time:7
left time:6
left time:5
left time:4
left time:3
left time:2
left time:1
game is over!
2.实现Runnable接口
package dong.test;
public class Test implements Runnable{
@Override
public void run() {
for(int i=10;i>0;i--){
try {
System.out.println("left time:"+i);
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
System.out.println("game is over!");
}
public static void main(String[] args){
Test test = new Test();//创建一个线程类实例
Thread thread = new Thread(test);//以上面创建的线程类实例创建一个Thread实例
thread.start();//启动线程
}
}
运行结果:
left time:10
left time:9
left time:8
left time:7
left time:6
left time:5
left time:4
left time:3
left time:2
left time:1
game is over!
代码1
package dong.test;
public class TheadTest {
public static void main(String[] args) {
Runnable runner = new Runnable() {
@Override
public void run() {
System.out.println("foo");
}
};
Thread t = new Thread(runner);
t.start();
//t.run();
System.out.println("boo");
}
}
1.运行结果:
boo
foo
代码2
package dong.test;
public class TheadTest {
public static void main(String[] args) {
Runnable runner = new Runnable() {
@Override
public void run() {
System.out.println("foo");
}
};
Thread t = new Thread(runner);
// t.start();
t.run();
System.out.println("boo");
}
}
2.运行结果:
foo
boo
调用start()方法后,线程会被放到等待队列中,等待CPU的调度,并不一定马上开始执行,只是将这个线程置于就绪(Runnable)的状态;然后通过JVM分配CPU执行时间,此时线程Thread才会调用run()方法。
代码2中是手动调用run()方法;这样和调用普通的方法没有什么区别;