程序:是一段静态的代码;
进程:处于运行过程的程序,是动态的,是独立存在的,拥有自己的资源,自己的私有地址;多个进程可以在单个cpu上并发执行;
(并发性:同一时刻,只能有一条指令执行,在cpu快速切换的情况下看起来像同时执行;并行性:同一时刻多条指令在多个cpu上同时执行;)
线程:程序的一条执行路径;一个进程可以有多个线程;
因为硬件和操作系统的不同而采用不同的策略:共用的多任务操作策略;抢占式多任务操作策略(大多数采用这种,效率高);
三种线程的创建方式:
1. 继承Thread类:
需要注意的是,用继承thread的方法创建线程,多个线程之间无法共享线程类的实例变量;
public class threadtest extends Thread{
@Override
public void run() {
//1.首先重写run方法,这里就是线程执行体;该线程要执行的代码
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//2.创建该类-这里是theradtest的子类
threadtest testthread = new threadtest();
//3.调用.start()方法启动该线程;
testthread.start();
}
}
2.实现Runnable接口:
相对于上一种方法,没有单继承的局限性,可以多实现;而且多个线程可以共同操作共有的资源;
//1.创建一个实现了Runnable接口的类;
public class threadtest implements Runnable{
@Override
public void run() {
//2.还是要重写run方法,这里就是线程执行体;该线程要执行的代码
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//3.创建该类的实例;
threadtest testthread = new threadtest();
//4.把这个实例作为参数传入Thread的构造方法;new一个Thread类,这个类就是创建出来的线程类;
Thread imtest = new Thread(testthread);
//5.启动线程,还是必须调用start方法;
imtest.start();
}
}
3.使用Callable和Future 创建线程 :
这个方法还没用过。 不太懂。
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
//1.先实现一个Callable接口;
public class Threadtest1 implements Callable<Integer>{
public static void main(String[] args) {
// TODO Auto-generated method stub
//3.创建一个实现了Callable接口的类
Threadtest1 threadtest1 = new Threadtest1();
//4.用Future包装这个类
FutureTask<Integer> task = new FutureTask<>(threadtest1);
//5.包装之后的类作为参数传入Thread的构造函数
Thread thread1 = new Thread(task);
//6.调用start方法;
thread1.start();
}
//2.重写call方法
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
//这里相当于Thread的run方法,线程执行体
System.out.println(Thread.currentThread().getName());
return null;
}
}
4.匿名方式:
public class Createway3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread test1 = new Thread(){
public void run() {
System.out.println("匿名类1");
for (int i = 0; i < 1000; i++) {
System.out.println("匿名类1:"+i);
}
}
};
Thread test2 = new Thread(){
public void run() {
System.out.println("匿名类2");
for (int i = 0; i < 1000; i++) {
System.out.println("匿名类2:"+i);
}
}
};
test1.start();
test2.start();
}
}