线程与进程

进程:进程(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的方法里面即可,此时锁是当前实例化的对象。

 

posted @ 2019-11-12 15:54  cow09  阅读(126)  评论(0)    收藏  举报