码迷,mamicode.com
首页 > 编程语言 > 详细

多线程

时间:2019-08-04 19:53:47      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:int   顺序   业务   方法   rri   方式   说明   代码   art   

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

什么场景使用多线程技术?
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()的顺序
技术图片

多线程

标签:int   顺序   业务   方法   rri   方式   说明   代码   art   

原文地址:https://www.cnblogs.com/lick468/p/11299245.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!