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接口创建线程的方式是这样开启线程?

java基础----多线程(1)_ide


java基础----多线程(1)_java_02

3.线程的生命周期

java基础----多线程(1)_ide_03


java基础----多线程(1)_ide_04