java基础----多线程(1)
原创
©著作权归作者所有:来自51CTO博客作者wx5add7776993de的原创作品,请联系作者获取转载授权,否则将追究法律责任
1.线程和进程
1.什么是进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。eg:打开迅雷软件,迅雷软件在运行,就是一个进程。
2.什么是线程
线程,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。eg:迅雷软件中正在下载的任务一,任务二,就相当于线程
3.线程和进程的区别
1.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
2.进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
3.进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
2.java创建线程的三种方式
1.继承Thread类
package com.javaThread.day1;
/**
*@author caikeren
*@version 2019年1月15日下午11:23:59
*创建线程的方式一:继承Thread重写run方法
*/
public class ThreadTest1 extends Thread{
//线程体
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++) {
System.out.println("线程一"+this.getName()+this.getPriority());
}
}
}
2.实现Runnable接口
package com.javaThread.day1;
/**
*@author caikeren
*@version 2019年1月16日上午12:41:34
*创建线程的方式二:实现runnable接口
*/
public class ThreadTest2 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++) {
System.out.println("线程二"+Thread.currentThread().getName());
}
}
}
3.实现Callable接口
package com.javaThread.day1;
import java.util.Random;
import java.util.concurrent.Callable;
/**
*@author caikeren
*@version 2019年1月16日上午12:56:10
*创建线程的方式三:实现callable接口
*/
public class ThreadTest3 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
return new Random().nextInt(10);
}
}
测试,开启线程
package com.javaThread.day1;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
*@author caikeren
*@version 2019年1月16日上午12:34:50
*/
public class MainTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
*创建线程对象,并开启线程
*/
//方式一
Thread thread1 = new ThreadTest1();
thread1.start();
//方式二
Runnable runnable = new ThreadTest2();
Thread thread2 = new Thread(runnable);
thread2.start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("匿名内部类创建线程3");
}
}).start();
//方式三
Callable<Integer> callable = new ThreadTest3();
FutureTask<Integer> futureTask = new FutureTask<>(callable);
Thread thread3 = new Thread(futureTask);
//开启线程
thread3.start();
//得到返回值
try {
System.out.println(futureTask.get());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
思考,为什么Callable接口创建线程的方式是这样开启线程?
3.线程的生命周期