线程和进程

1.什么是进程?

进行运行得程序叫做进程,进程是系统分配资源得基本单位,使用PID来区分进程。

2.什么是线程?

线程是进程中得一条执行路径,也是CPU的基本调度单位。一个进程由一个或多个线程组成,彼此间完成不同的工作,同时执行,称为多线程。

3.进程和线程之间的区别----面试题

①进程是操作系统资源分配的基本单位。而线程是CPU的基本调度单位。

②一个程序运行后至少有一个进程。

③一个进程可以包含多个线程,但是至少需要有一个线程,否则这个进程是没有意义的。

④进程间不能共享数据段地址,但是同进程的线程之间可以。

4.为什么使用线程?

为了解决负载均衡问题,充分利用CPU资源,为了提高CPU的使用率,采用多线程的方式去同时完成几件事而不互相干扰,为了处理大量的IO操作时或处理的情况需要花费大量的时间等等,比如:读写文件,视图图像的采集,处理,显示,保存等。。。。。

单核时代:

在单核时代多线程主要是为了提高CPU和IO设备的综合利用率。举个例子:当只有一个线程的时候会导致CPU计算时,IO设备空闲;进行IO操作时,CPU空闲。我们可以简单地说这两者的利用率目前都是50%左右。但是当有两个线程的时候就不一样了,当一个线程执行CPU计算时,另外一个线程可以进行IO操作,这样两个的利用率就可以在理想情况下达到100%了。

多核时代:

多核时代多线程主要是为了提高CPU利用率。举个例子:假如我们要计算一个复杂的任务,我们只用一个线程的话,CPU只会一个CPU核心被利用到,而创建多个线程就可以让多个CPU核心被利用到,这样就提高了CPU利用率。

5.如何创建线程?

(1.继承Thread类,重写run方法       2.实现Runnable接口        3.实现Callable接口)

①通过继承Thread类

package com.zd.demo04;
//继承Thread类
public class MyThread extends Thread{
    //重写run方法
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("线程"+i);
        }
    }
}
package com.zd.demo04;

public class Test {
    public static void main(String[] args) {
        //创建一个线程对象
        MyThread myThread = new MyThread();
        //开启线程,当前线程就和main线程同时竞争CPU时间片
        myThread.start();
        for (int i = 0; i < 10; i++) {
            System.out.println("main线程"+i);
        }
    }
}

②实现Runnable接口

public class MyRunnable implements Runnable{
    
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"线程:"+i);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();//线程任务
        Thread a = new Thread(runnable, "线程A");
        a.start();//开启线程
        //线程对象
        Thread b = new Thread(runnable, "线程B");
        b.start();//开启线程
        for (int i = 0; i < 10; i++) {
            System.out.println("main线程"+i);
        }
    }
}

例子:四个窗口共买100票

package com.zd.demo06;
//例子:四个窗口共买100张票
public class TickRunnable implements Runnable{
    private int ticket=100;
    @Override
    public void run() {
        while (ticket>0){
            System.out.println(Thread.currentThread().getName()+"买了一张剩余:"+--ticket);
        }
    }

    public static void main(String[] args) {
        TickRunnable runnable = new TickRunnable();
        Thread a = new Thread(runnable, "窗口A");
        Thread b = new Thread(runnable, "窗口B");
        Thread c = new Thread(runnable, "窗口C");
        Thread d = new Thread(runnable, "窗口D");
        a.start();//开启线程
        b.start();
        c.start();
        d.start();
//测试的结果:同一张票被多个窗口买,而且出现负票。因为线程安全问题
    }
}

6.为线程起名以及获取线程名称

1.获取线程名称

①this.getName()  必须是Thread的子类

②Thread.currentThread.getName();在任意位置获取线程名称

2.为线程起名:

①通过调用setName方法,该类对象必须是Thread的对象

②通过构造方法

7.线程中常见的方法

①public   static  void   sleep(long)休眠

②public  static  void  yield();放弃本次时间片,回到就绪状态,参与下次时间片的争夺

③public  void   join()允许其他线程加入当前线程,直到其他线程允许结束后。当前线程才可以运行

④setPriority();设置优先级 ,值1-10值越大,获取CPU的概率越大。默认值为5

⑤setDaemon():设置守护线程,所有前台线程结束后,守护线程才会结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值