多线程1

原创 2015年07月07日 13:42:23

多线程是由于cpu的时分处理原理导致的技术

实际上是因为多个线程对同一个资源进行操作的技术

可以解决许多实际问题

但由此引发的问题是安全和死锁也需要相应的解决办法

 

主要有两种模型:

1 多个线程使用相同的操作操作同一个资源(卖票)

2 多个线程使用相反的操作操作同一个资源(生产者消费者)

 

卖票:

关键点:

1 ticket是共享资源 注意它的处理方式

2注意线程的安全问题

3注意while(true)和同步代码块的位置

 

class TicketDemo2

{

         publicstatic void main(String[] args)

         {

                   Tickett = new Ticket();

 

                   Threadt1 = new Thread(t);

                   Threadt2 = new Thread(t);

                   Threadt3 = new Thread(t);

                   Threadt4 = new Thread(t);

 

                   t1.start();

                   t2.start();

                   t3.start();

                   t4.start();

                           

                   System.out.println("-----------------");

                   System.out.println("MissionComplete!");

         }

}

 

class Ticket implements Runnable

{

         privateint ticket = 1000;  //注意 这里的ticket虽然没有static修饰 但也是共享数据

         //注意这个数字要搞大 否则cpu在切换之前就已经把票卖完了 你看不要想要的现象的

         //之前我搞成50 总是就一个窗口在卖票

 

         Objectobj = new Object();

 

         publicvoid run()

         {       

                   while(ticket>0)//这句也非常重要

                   //如果这句话在同步代码块里面 那么一个线程一旦进入了同步代码块 就会一直

                   //执行到结束(ticket==1)

                   //而这个线程永远都会是Thread0因为看似多线程同时执行实际上不过是先后执行

                   //因为代码的顺序是:

                   /*

                   t1.start();

                   t2.start();

                   t3.start();

                   t4.start();

                  

                   但如果这条语句不在同步代码块里面 而同步代码块里面除了输出语句和sleep方法以外

                   什么都没有的话

                   那么同步的代码将没有

                  

                   */

                   {

                            synchronized(obj)

                            {

//                                  if(ticket>0)  //注意这句话非常重要

                            //如果没有这句话 相当于同步代码块里面没有结束的信号

//                                  {

                                               try

                                               {

                                                        Thread.sleep(1);//注意这个数字不要搞大了

                                                        //对于cpu来说 1ms是很久一段时间

                                                        //搞大了以后 程序运行的总时间就会很长

                                                        //因为卖一次票就会睡1ms

                                                        //具体体现就是程序不是刷地出来一片 然后

                                                        //就结束了 而是明显看出来一条一条出来的

                                               }

                                               catch(Exception e)

                                               {

                                                        System.out.println("卧槽我错了");

                                               }

                                               System.out.println("从"+Thread.currentThread().getName()+

                                                        "号窗口:"+"卖出的车票编号"+ticket);

                                               ticket--;//

//                                  }

                            }       

                   }

         }

}

 

死锁实现:

关键点:

1两个不同的锁分别被两个不同的线程调用

2同步要嵌套

3 不一定每次运行都会出现

/*

需求:

死锁来一发

 

*/

 

class DeadLockDemo2

{

         publicstatic void main(String[] args) throws

InterruptedException

         {

                   Threadt1 = new Thread(new Test(true));

                   Threadt2 = new Thread(new Test(false));

 

                   t1.start();

                   t1.sleep(10);

                   t2.start();

         }

        

         publicstatic void sop(Object obj)

         {

                   System.out.println(obj);

         }

}

 

class MyLock

{

         staticObject locka = new Object();

         staticObject lockb = new Object();

}

 

class Test implements Runnable

{

         privateboolean flag;

 

         Test(booleanflag)

         {

                   this.flag= flag;

         }

 

         publicvoid run()

         {

                   if(flag == true)

                   {

                            while(true)

                            {

                                     synchronized(MyLock.locka)

                                     {

                                               sop("true&locka");

                                               synchronized

(MyLock.lockb)

                                               {

                                                        sop

("true&lockb");

                                               }

                                     }

                            }

                   }

                   else

                   {

                            while(true)

                            {

                                     synchronized(MyLock.lockb)

                                     {

                                               sop("false&lockb");

                                               synchronized

(MyLock.locka)

                                               {

                                                        sop

("false&locka");

                                               }

                                     }

                            }

                   }

         }

 

         publicstatic void sop(Object obj)

         {

                   System.out.println(obj);

         }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

新家首发——试跑多线程

试跑C++多线程
  • bzdwdmzjsmff
  • bzdwdmzjsmff
  • 2016年04月25日 17:29
  • 2939

多线程 +1操作的几种实现方式,及效率对比

比较LongAdder ,Atomic,synchronized 以及使用Unsafe类中实现的cas 和模拟Atomic,在多线程下的效率 ,见代码,放开对应注释,运行即可看到结果; im...
  • zqz_zqz
  • zqz_zqz
  • 2017年02月28日 16:40
  • 455

linux网络编程之简单的服务器多线程

服务器&客户端demo 最近两天了linux的网络编程,自己写了一个demo,熟悉socket的几个主要API的用法: 虚拟机下的ubuntu 14.04 OS,程序包括: 客户端:发送连接请求;一旦...
  • frank_jb
  • frank_jb
  • 2016年07月26日 18:12
  • 2301

Java多线程干货系列(1):Java多线程基础

前言多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧。正文线程与进程1 线程:进程中负责程序执行的执行单元...
  • simplebam
  • simplebam
  • 2017年07月04日 08:44
  • 263

Java核心技术卷1 第十四章 多线程

14.1 什么是线程 一个程序同时可以执行多个任务。通常,每一个任务称为一个线程,可以同时运行一个以上线程的程序称为多线程程序。多进程与多线程的区别: 每个进程拥有自己的一整套变量,而线程则...
  • qq_30154277
  • qq_30154277
  • 2016年07月02日 21:55
  • 398

Java多线程之生产者消费者模式

Java多线程之生产者/消费者模式1. 描述生产者/消费者问题是研究多线程程序时绕不开的经典问题之一,它主要描述的是用一个缓冲区作为仓库,生产者可以将生产的产品放入仓库,消费者则可以从仓库中取走产品。...
  • zhliro
  • zhliro
  • 2015年07月20日 08:57
  • 495

JAVA基础学习--一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized

使用synchronized package com.pb.thread.demo5; /**使用synchronized * 一个线程加一运算,一个线程做减法运算,多个线程...
  • ko0491
  • ko0491
  • 2015年09月19日 19:41
  • 1078

简单的 java 多线程编程练习。

9.     Java多线程编程题: 启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. ...
  • u010484308
  • u010484308
  • 2014年12月04日 16:49
  • 1474

多线程(一) —— 传统线程(Thread)的创建和计时器(Timer)

1.传统线程两种实现方式 2.计时器(Timer)
  • u013501637
  • u013501637
  • 2016年06月26日 16:23
  • 2502

Java多线程干货系列—(二)synchronized

前言 本篇主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题。没错就是使用synchronized。 正文 如何解决线程安全问...
  • ChatHello
  • ChatHello
  • 2017年04月05日 08:46
  • 701
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程1
举报原因:
原因补充:

(最多只允许输入30个字)