什么是线程

1.什么是进程?

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

2.什么是线程?

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

3.进程和线程的区别

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

        (2)一个程序运行后至少有一个进程

        (3)一个进程可以包含多个线程,但是只有需要有一个线程,否则这个进程是没有意义。

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

4.为什么使用线程

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

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

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

5.Java如何创建线程

(1)通过继承Thread类

package com.company;


/**
 * 继承Thread类
 */
public class MyThread extends Thread{
    public MyThread(String name) {
        super(name);
    }

    /**
     * 重写run方法
     */
    @Override
    public void run() {
        for (int i = 0; i <30 ; i++) {
         
            System.out.println("线程"+i);
        }
    }
}

测试类

package com.company;

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

(2)实现Runnable接口

package com.ykq.demo03;

public class MyRunable implements Runnable {
    public void run() {
        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+"线程:"+i);
        }
    }
}
public class TestRunabel {
    public static void main(String[] args) {

        MyRunable m1=new MyRunable(); //线程任务

        //线程对象
        Thread t1=new Thread(m1,"线程A");
        t1.start();

        //线程对象
        Thread t2=new Thread(m1,"线程B");
        t2.start();

        for (int i = 0; i <20 ; i++) {
            System.out.println("main线程:"+i);
        }

    }
}

(3)为线程起名 和获取线程名称

获取线程名称.

[1]this.getName()必须是Thread得子类

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

2.为线程起名:

[1]通过调用setName方法 该类对象必须是Thread得对象

[2]通过构造方法

package com.company;


/**
 * 继承Thread类
 */
public class MyThread extends Thread{

    //第一种:  在线程对象中 创建一个有参构造
    public MyThread(String name) {
        super(name);
    }

    /**
     * 重写run方法
     */
    @Override
    public void run() {
        for (int i = 0; i <30 ; i++) {
            //Thread.currentThread().getName() 获取线程名称
            System.out.println(Thread.currentThread().getName()+"线程"+i);
        }
    }
}

测试类

package com.company;

public class TestThread {
    public static void main(String[] args) {
        MyThread m1 = new MyThread("C");
        //第二种 : 用对象名.setName("A")
      /*  m1.setName("A");*/
        m1.start();
        MyThread m2 = new MyThread("D");
     /*   m2.setName("B");*/
        m2.start();

        for (int i = 0; i <30; i++) {
            System.out.println("main:"+i);
        }
    }
}

6.线程中常用的方法

  1. public static void sleep(long) 休眠

  2. public static void yield():放弃本次时间片,回到就绪状态,参与下次时间片得争夺

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

  4. setPriority():设置优先级 值1-10 值越大获取cpu得概率越大。默认为5

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值