进程与线程

1 概念

进程就是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。进程中所包含的一个或多个执 行单元称为线程。
一个线程是进程的一个顺序执行流。同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈。

2 进程与线程的区别

1一个进程至少有一个线程。
2线程的划分尺度小于进程,使得多线程程序的并发性高。
3进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
4线程在执行过程中与进程的区别在于每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

3 优缺点

线程执行开销小,但不利于次元管理和保护;而进程相反。
线程适合于SMP机器上运行,管理科跨机器迁移。

4 并发原理

多个线程或进程”同时”运行,OS的线程调度机制将时间划分为很多时间片段(时间 片),尽可能均匀分配给正在运行的程序,获取CPU时间片的线程或进程得以被执行,其他则等待。而CPU则在这些进程或线程上来回切换运行。微观上所有进 程和线程是走走停停的,宏观上都在运行,这种都运行的现象叫并发,但是不是绝对意义上的“同时发生。

5 线程状态

在这里插入图片描述
New(新建状态):当我们创建一个线程时,该线程并没有纳入线程调度,其处于一个new状态。Runnable(就绪状态):当调用线程的start方法后,该线程纳入线程调度的控制,其处于一个可运行状态,等待分配时间片段以并发运行。
Running(运行状态):当该线程被分配到了时间片段后其被CPU运行,这是该线程处于running状态。
Blocked(阻塞状态):当线程在运行过程中可能会出现阻塞现象,比如等待用户输入信息等。但阻塞状态不是百分百出现的,具体要看代码中是否有相关需求。
Dead:(死亡状态)当线程的任务全部运行完毕,或在运行过程中抛出了一个未捕获的异常,那么线程结束,等待GC回收(你永远无法叫醒一个死亡的线程

6 代码块

//使用Thread创建线并启动线程
public class TestThread extends Thread{
        @Override        
        public void run() {    
                for(int i=0;i<100;i++){        
                        System.out.println("我是线程");            
                }        
         }    
}
//使用Runnable创建并启动线程
public class TestRunnable implements Runnable{
        @Override        
        public void run() {     
               for(int i=0;i<100;i++){      
                         System.out.println("我是线程");            
               }        
        }    
}
//启动线程的方法:
  Runnable runnable = new TestRunnable();
  Thread thread = new Thread(runnable);//实例化线程并传入线程体
  thread.start();//启动线程 
//使用内部类创建线程
//继承Thread方式:    
  Thread thread  = new Thread(){
      //匿名类方式创建线程         
      public void run(){     
             //线程体            
      }    
  };    
  thread.start();
  //启动线程    Runnable方式:    
  Runnable runnable  = new Runnable(){ 
     //匿名类方式创建线程         
     public void run(){            
     }    
  };    
  Thread thread = new Thread(runnable);    
  thread.start();//启动线程 



String getName():返回该线程的名称
int getPriority():返回线程的优先级 
Thread.state getState():获取线程的状态 
boolean isAlive():测试线程是否处于活动状态 
boolean isDaemon():测试线程是否为守护线程
boolean isInterrupted():测试线程是否已经中断 

7 线程优先级

线程的切换是由线程调度控制的,我们无法通过代码来干涉,但是我们可以通过提高线程的优先级来最大程度的改善线程获取时间片的几率。
线程的优先级被划分为10级,值分别为1-10,其中1最低,10最高。线程提供了3个常量来表示最低,最高,以及默认优先级:Thread.MIN_PRIORITY,Thread.MAX_PRIORITY,Thread.NORM_PRIORITY设置优先级的方法为: void setPriority(int priority)

8 守护线程

守护线程与普通线程在表现上没有什么区别
守护线程的特点是,当进程中只剩下守护线程时,所有守护线程强制终止。
GC就是运行在一个守护线程上的。
需要注意的是,设置线程为后台线程要在该线程启动前设置。
Thread daemonThread = new Thread();
daemonThread.setDaemon(true);
daemonThread.start();

9sleep方法;yield方法;join方法

Thread的静态方法sleep用于使当前线程进入阻塞状态:
static void sleep(long ms)该方法会使当前线程进入阻塞状态指定毫秒,当指定毫秒阻塞后,当前线程会重新进入Runnable状态,等待分配时间片。该方法声明抛出一个InterruptException。所以在使用该方法时需要捕获这个异常。
例如:电子钟程序

public static void main(String[] args) {
        SimpleDateFormat   sdf  = new SimpleDateFormat("hh:mm:ss");    
        while(true){ 
                   System.out.println(sdf.format(new Date()));
                   try {       
                            Thread.sleep(1000);//每输出一次时间后阻塞1秒钟
                   } catch (InterruptedException e) {        
                           e.printStackTrace();            
                   }        
        }    
}

Thread的静态方法yield:
static void yield()该方法用于使当前线程主动让出当次CPU时间片回到Runnable状态,等待分配时间片。
Thread的方法join:
void join()该方法用于等待当前线程结束。此方法是一个阻塞方法。该方法声明抛出InterruptException。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值