java多进程 -CD7-孙鑫-(1)-程序/进程/线程/设置后台线程/将当前线程暂停

程序、进程和线程

  1. 程序是计算机指令的集合,它以文件的形式存储在磁盘上。
  2. 进程:是一个程序在其自身的地址空间中的一次执行活动。
  3. 进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源。
  4. 线程:是进程中的一个单一的连续控制流程。一个进程可以拥有多个线程。
  5. 注意:在一个地址空间中至少有一个线程
  6. 多个任务时采用多线程而不是多进程?因为进程是占用独立的地址空间,进程切换时需要交换内存空间,多线程共享同一个存储空间,所以多线程切换只需要改变程序的执行路线和局部变量,切换的效率远远高于进程之间的切换效率。线程是占用资源代价比较小,这样对服务器端资源的利用效率的提升合理利用都有好处

class MultiThread
{
    public static void main(String[] args)
    {
        MyThread myThread = new MyThread();
        myThread.start();
        //获取当前的线程并且获取它的名字
        System.out.println("main方法线程的名字" + Thread.currentThread().getName());   
    }
}
class MyThread extends Thread
{
    //run方法是线程的入口函数
    public void run()
    {
            System.out.println(getName());
    }   
}

解析:先打印出main方法线程的名字再打印出myThread线程的名字
操作系统分配时间片, 当我们调用start()时,main方法所在的时间片没有到期所以继续运行,打印他所在线程的名字,当main方法所在线程到期了,jvm 调用run方法


变形:将myThread设置为后台线程,借助方法setDaemon(),参数:true就是后台线程;该方法在线程启动之前调用也就是说在myThread调用之前调用。
jvm在仅剩下后台进程时jvm会退出

class MultiThread
{
    public static void main(String[] args)
    {
        MyThread myThread = new MyThread();
        myThread.setDaemon(true);
        myThread.start();
        int index = 1;
        while(true)
        {
                if(index++ == 500)
                break;
                //获取当前的线程并且获取它的名字
        System.out.println("main方法所在的线程的名字:" + Thread.currentThread().getName());   
        }
    }
}
class MyThread extends Thread
{
    //run方法是线程的入口函数
    public void run()
    {
        while(true)
        {
            System.out.println(getName());  
        }   
    }   
}

该例子结果是main线程名字和myThread线程的名字交替打印出来,当满足break条件了,main线程停止了myThread这个后台线程也停止了。


class MultiThread
{
    public static void main(String[] args)
    {
        MyThread myThread = new MyThread();
        myThread.setDaemon(true);
        myThread.start();
        int index = 1;
        while(true)
        {
                if(index++ == 1000)
                break;
                //获取当前的线程并且获取它的名字
        System.out.println("main方法所在的线程的名字:" + Thread.currentThread().getName());   
        }
    }
}
class MyThread extends Thread
{
    //run方法是线程的入口函数
    public void run()
    {
        while(true)
        {
            System.out.println(getName());  
            yield();//将当前线程暂停
        }   
    }   
}

结果是当我们轮到myThread线程就切换到main线程打印,当main线程时间片消耗完再打印myThread线程


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值