java-多线程-基本概念/四种种创建thread的方式

来源:互联网 发布:imdb评分靠谱吗 知乎 编辑:程序博客网 时间:2024/05/20 04:30
程序:是一段静态的代码;
进程:处于运行过程的程序,是动态的,是独立存在的,拥有自己的资源,自己的私有地址;多个进程可以在单个cpu上并发执行;
(并发性:同一时刻,只能有一条指令执行,在cpu快速切换的情况下看起来像同时执行;并行性:同一时刻多条指令在多个cpu上同时执行;)
线程:程序的一条执行路径;一个进程可以有多个线程;

因为硬件和操作系统的不同而采用不同的策略:共用的多任务操作策略;抢占式多任务操作策略(大多数采用这种,效率高);

三种线程的创建方式:
1. 继承Thread类:
需要注意的是,用继承thread的方法创建线程,多个线程之间无法共享线程类的实例变量;
public class threadtest extends Thread{@Overridepublic 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{@Overridepublic 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方法@Overridepublic 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 stubThread 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();}}


0 0