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

线程和简单并发问题

时间:2021-03-09 13:33:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:cpu   自己   结果   public   void   http   操作系统   nts   art   

线程的一些概念

? 很多多线程是模拟出来的,真整的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,在一个cpu的情况下,同一个时间点,cpu只能执行一个代码,因为切换的快,所以就有同时执行的错觉。

? @线程是独立的执行路径

? @在程序运行时,即使自己没有创建线程,后台也会有多个线程,如主线程,gc线程

? @在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序不能人为干预

? @线程会带来额外的开销,如cpu调度时间,并发控制开销

? @对同一份资源操作时,会存在资源抢夺问题,需要加入并发控制

? @每个线程在自己的工作内存交互,内存控制不当会造成数据不一致

Java中线程的创建

1 . 继承Thread类
//创建线程方式一:继承Thread类,重写run()方法,调用start()开启线程
public class TestThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++){
            System.out.println("我是线程,我在执行第"+i+"次");
        }
    }
    public static void main(String[] args) {
        TestThread testThread = new TestThread();
        testThread.start();

        for (int i = 0; i < 400; i++){
            System.out.println("hhhhhhhhh,我在执行第"+i+"次");
        }
    }
}

? 技术图片

这是上述代码的执行结果,可以看出线程与主线程是交替运行的。

? 线程开启不一定立即执行,而是等待CPU调度执行

2.实现Runnable接口

?

//创建线程方式2: 实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start()方法
public class ThreadTest_02 implements Runnable{
    @Override
    public void run() {
        for(int i  = 0 ;i<20;i++){
            System.out.println("AaAAAAAAA"+"   "+i);
        }
    }

    public static void main(String[] args) {
        ThreadTest_02 thread01 = new ThreadTest_02();
        //Thread thread = new Thread(thread01);
        //thread.start();
        /*
        	上面注释里是另一种调用方法,推荐使用下面的方法
        */
        new Thread(thread01).start();


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

? 推荐使用实现Runnable接口的方式,可以避免单继承局限性,灵活方便,方便同一个对象被多个对象使用

3.实现Callable接口

并发问题

//多个线程操作一个对象实例
//买火车票
//多个线程操作同一个资源的情况下,数据不安全
public class ThreadTest_03 implements Runnable{
    private int ticketNums = 15;
	@Override
    public void run() {
        while(true){
            if(ticketNums <= 0){
                break;
            }

            System.out.println("恭喜"+Thread.currentThread().getName()+"拿到了第"+ticketNums--+"张票");
        }
    }

    public static void main(String[] args) {
        ThreadTest_03 t1 =new ThreadTest_03();


       new Thread(t1,"wsl").start();
        new Thread(t1,"gxx").start();
        new Thread(t1,"黄牛").start();
    }
}

线程和简单并发问题

标签:cpu   自己   结果   public   void   http   操作系统   nts   art   

原文地址:https://www.cnblogs.com/wsl975/p/14501855.html

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