线程与进程
进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。(百度百科)
比如:2345加速浏览器、eclipse、任务管理器、正在操作系统中运行“.exe”等

线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以有很多线程,每条线程并行执行不同的任务。
比如我现在电脑正在执行的进程(57个)。像QQ.exe运行的时候就有很多子任务在运行,比如聊天线程、好友视频线程、下载文件线程等等。

1、线程组成:虚拟CPU和执行代码、处理的数据
2、线程与进程的区别:操作系统分配内存空间不一样,进程分配有独立的内存空间,而线程必须与同一进程的其他线程共用空间,消耗的也相对较小。
3、线程优先级
单核计算机只有一个CPU,各个线程轮流获得CPU的使用权,才能执行任务
(1)优先级高的线程有更多的机会获得CPU的机会,反之亦然。
(2)优先级用户在那个数表示,取值范围是1~10,一般情况下线程是默认的。
(3)优先级都是5,但是也可以设置setPriority和getPriority方法来设置或返回优先级。
4、创建线程的方式
(1)继承Thread类,并重写run()方法。
public class ThreadDemo extends Thread{
public void run(){
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread()+":"+i);
}
}
}
public class ThreadTest{
public static void main(String []args){
ThreadTest test = new ThreadTest();
test.start();
}
}
(2)实现Runnable接口
public class ThreadDemo{
public static void main (String []args) {
Threadtest test1 = new Threadtest();
Threadtest test2 = new Threadtest();
Threadtest test3 = new Threadtest();
Thread thread1 = new Thread(test1);
Thread thread2 = new Thread(test2);
Thread thread3 = new Thread(test3);
thread1.start();
thread2.start();
thread3.start();
}
}
public class Threadtest implements Runnable{
punblic void run(){
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
(3)实现Callable接口,并实现call方法。
public class ThreadDemo{
public static void main (String []args){
public void call() throws Exception{
FutureTask<Integer> futuretask = new FutureTask<Integer>(new Callable<Integer>());
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}return 1;
}
Executor executor = Executor.newFixedThreadPool(1);
(( ExecutorSrevice) executor) . submin(futuremask);
}
}
5、线程的集中状态
(1)新建立的状态
即Thread t1 = new Thread ();
(2)可运行的状态Runnable
线程创立,调用start()方式就处于可运行状态,等待获取cpu资源后方可执行。
(3)running运行
线程获得CPU资源,执行run()方法。
(4)waiting等待
(5)TIMED_WAITING超市等待
(6)TERMINATED终止
(7)阻塞Blocked
阻塞是因为线程因为某种原因放弃了cpu的使用权,暂时停止运行,知道线程进入可运行状态,重新获取cpu资源。阻塞情况分为三种
1)等待阻塞:运行的线程执行wati()方法,jvm会将线程放入等待队列。
2)同步阻塞:运行的线程在获取对象的同步锁时,该锁被占用,线程放入锁池中。
3)其他阻塞:运行的线程执行 Thread . sleep 或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态
(8)死亡dead
线程main()方法或run()方法执行结束,或者因为异常而退出线程,死亡线程不可再复生。
6、线程安全问题
(1)同步(synchronized)方法块:锁是括号里面的对象,只需要将操作共享的数据放在synchronized中。
(2)普通同步方法:将操作共享数据的代码抽出来放入一个synchronized的方法里面即可,此时锁是当前实例化的对象。

浙公网安备 33010602011771号