多线程

Posted lick468

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。

线程是在进程中独立运行的子任务。

什么场景使用多线程技术?
1.阻塞。一旦系统中出现了阻塞现象,则可以根据实际情况来使用多线程技术提高运行效率。
2.依赖。业务分为两个执行过程,A和B,A业务发生阻塞时,B业务不需要A业务的执行结果,这时B业务可以使用多线程技术提高运行效率。

多线程是异步的。多线程随即执行,是因为CPU将时间片(时间片是CPU分配给各个程序的时间)分给不同的线程,线程获得时间片后才能执行任务。
CPU在不同的线程上进行切换是需要耗时的,所以并不是创建的线程越多,软件运行效率就越高,相反,线程过多反而会降低软件的执行效率。

实现多线程技术的两种方式: 1.继承Thread类,2.实现Running接口。
说明 :1.Thread 类实现了Running接口。 2.使用继承Thread类的方式创建新线程时,就不支持多继承了。

public class Thread implements Runnable

继承Thread类创建线程。

MyThread.java

package thread;

public class MyThread extends Thread 
    @Override
    public void run() 
        super.run();
        System.out.println("运行了MyThread");
    

MyThreadRun.java

package thread;

public class MyThreadRun 
    public static void main(String[] args) 
        MyThread thread = new MyThread();
        thread.start();// 耗时大
        System.out.println("结束");//耗时小
    

运行结果
技术图片

实现Running接口创建线程。

MyRunning.java

package thread;

public class MyRunning implements Runnable 
    @Override
    public void run() 
        System.out.println("运行了MyRuning");
    

MyRunningRun.java

package thread;

public class MyRunningRun 
    public static void main(String[] args) 
        Runnable runnable = new MyRunning();
        Thread thread = new Thread(runnable);
        thread.start();
        System.out.println("运行结束");
    

运行结果
技术图片

共享数据 : 多个线程可以访问同一个变量。例如购票。

使用synchronized 关键字,使多个线程在执行run方法时,以排队的方式进行处理。
synchronized可以对任何对象及方法加锁,而加锁的这段代码称为“互斥区”或"临界区",
MyThread.java

package thread;

public class MyThread extends Thread 
    private int count = 5; //总票数
    @Override
    synchronized public void run() 
        super.run();
        count--;
        System.out.println("由 " + Thread.currentThread().getName() +" 售票, 现在剩余票count = " + count );
    

MyThreadRun.java

package thread;

public class MyThread extends Thread 
    private int count = 5; //总票数
    @Override
    synchronized public void run() 
        super.run();
        count--;
        System.out.println("由 " + Thread.currentThread().getName() +" 售票, 现在剩余票count = " + count );
    

运行结果 可以看到运行结果并不是按照ABCDE 进行执行的,说明执行start()的顺序不代表执行run()的顺序
技术图片

以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章

什么是多线程,多进程?

多线程和多进程模式有啥区别

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥

c++ 多线程与c多线程有啥区别?

IOS多线程安全(线程锁)