`

多线程(二)

 
阅读更多

自己设计多线程程序

     如何设计使用线程呢?思考:线程是运行在进程上的,要使用线程必须先需要进程。进程是由windows系统分配给应用程序的。所以只要我们写的程序有入口,都是应用程序。通过查看api实现多线程有两种方法,现在我们首先了解第一种实现多线程的方法。

     继承Thread类并实现run方法,就可以实现多线程。

     怎么样启动一个线程呢?

    线程的启动需要手动的调用线程对象的start方法进程开启线程。

   开启线程的start方法中有两个作用1.启动线程  2.执行run方法

   线程的运行和进程一样。通常我们说所的线程之间会抢夺cpu资源,同过观察运行例子程序确实是这样的,但是实际上是分给cpu进程的cpu根据线程执行的优先权进程执行线程的。同一个时间,只有一个线程运行,不能多个线程并发的运行。

   我们写一个java应用,通过main入口的就是主线程,在主线程中我们可以开启子线程。主线程和子线程是快速交替的在进程中运行的。

 

病毒类的程序:一直抢先执行自己的线程,不允许其他程序抢占cpu资源。这个是病毒程序的设计的思路。

 

思考:为什么我们要覆盖run方法呢

         因为我们要在run方法中书写我们要执行的程序。父类thread 的run方法中为空的方法。

思考: Thread t  = new Thread(); t.star(); 这样能否开启线程

        这样能开启线程,同过start启动线程和执行线程的run方法是空的,这样的线程毫无意义

思考:我们用继承了线程的对象  t  直接调用run方法和start方法有什么却别

        直接调用t.run 方法,对我们来说跟调用普通方法的run方法是一样的,并没有执行线程。当一个程序执行到t.run方法的时候,只有执行完run方法才会执行下面的程序,这个执行是在主线程中,不会和主线程交替执行。调用run方法开启了线程。就会和主线程进行交替的执行。

 

 

线程的状态:

临时状态

 

     临时状态是有执行权,但是cpu暂时没有分配其执行。需要等待某个时刻由cpu分配了执行全,此线程就可以执行。

 

冻结状态:

      当线程调用sleep或wait方法的时候,线程主动放弃执行权。这时线程处于冻结状态。通知并告诉cpu这段时间不执行任何操作,所以cpu不会给其分配执行权。

     sleep 是睡眠多少秒后自动醒来,不需要别人叫醒。

     wait是等待 ,别人让你等待,并没说等待多长事件。别人用notify可以让你继续执行,不再等待。

 

 

运行状态

 

   正在执行的线程。

 

死亡状态

  当线程执行完,自动消亡。或调用stop方法消亡线程。

 

--------------------

可以获取和设置线程的名称。线程有默认的名称 是从0开始的。

Thread.currrent().getName 就可以获得线程的名称 也可以通过this方法获得线程的名称

Thread的构造方法中有一个含有参数的构造方法就是线程的名称  也可以通过setName方法设置线程的名称

---------------------

多线程买票

 

开启多线程卖100张票 就能产生一张票被多个线程卖

所以  把100张票设置成静态的 就可以解决问题。

但是控制台打印票的顺序到最后是132的原因是由双核cpu造成的

 

 

一个线程对象被多次启用,就会抛出线程非法异常。

跟运动员起跑类似,起跑时裁判员开枪,跑了一会又开枪,运动员不是疯了····

----------------------------

实现多线程的第二种方式  实现Runnable 接口

 

 

实现过程:

1.实现Runnable接口

2.实现run方法

3.创建Thread类的对象

4.Thread的构造方法中可以接收一个Runnable对象的参数

5.启动线程  thread对象.start

这时启动的不是Thread类中的空线程导入Run方法,而是实现了Runnable接口的run方法。

 

 

实现Runable接口和继承Thread的区别

1.java是单继承

2.run 方法所属不一样

runnable接口的好处。可以在使用线程的同时又能继承其他的类

----------------------------------

多线程的安全问题

 

比如卖票系统:当买到第0号票的时候  一个线程进了买票循环 没等到票数见一  另一个线程又进到了卖票循环 这样打票系统就会打出一张为0号的票  这是不符合实际的!

 

 

解决方法:一个线程卖完票后另一个线程才能执行其买票功能

     这里就可以用到同步代码块 synchronized(这个里面接受任意对象){

        需要同步的代码快

     }

-----------------------------------

同步:好处  可以解决线程安全问题

        不足: 线程每次执行的时候要判断是否锁旗标可以进入代码块

  使用地方: 1.必须要有两个以上线程

                   2.必须是共享的代码块

---------------------------------------

线程开启后 不一定马上执行

使用同步线程的时候注意是否用的锁旗标是一样的

静态同步方法的锁旗标不是this而是改类的字节码  A.class

 

 

 

单例有两种方式可以实现单例

1.饿汉模式

 

public class A{

     private static fianl A a = new A();

     private A(){}

     private static A  getAInstance(){

                return a;

     }

 

}

饿汉模式不会导致多线程的安全问题

2.懒汉模式

public class A{

      private static A a = null;

     private A(){

    }

    public static A getAInstance(){

              if(a==null){

                  a = new A();

              }else

                return a;

 

    }

 

}

分析:当开启两个线程1,和线程2.有中可能是线程1和线程2同时调用getAInstance 方法。

当线程1进了if方法后线程2也进了if方法,并不通事件都执行了 new A()所以在此可见单例被实例化了多次。导致安全问题发送。

解决方法:可以使用同步函数解决问题。但是同步函数有一定的缺陷。每次调用getAInstance的时候都要判断是否cpu把锁释放给改线程。

使用同步代买块和if嵌套可以解决问题,并切效率相对来说比较高。

 

if(a ==null){

  synchronized(obj){

    a  = new A();

     return a;

 

}

 

}else{

  return a;

}

 

经过代码的修改如上。只有当a为null的时候进入if代码块。判断是否拥有锁的权限。

 

------------------------------------

同步死锁的问题

如果有两个线程。进入a代码块 需要b代码块的锁。进入b代码块需要a代码块的锁。如果a.b两个锁不相互谦让。就出现死锁问题。

 

synchronized(a){

 

          

         synchronized(b){

       

 

          }

}

synchronized(b){

       

         

            synchronized(a){

       

 

               }

}

 

上图为模型

 

 

 

分享到:
评论
1 楼 zaocha321 2016-04-27  
建议改一下文章中的错别字。

相关推荐

    第二章多任务和多线程 第二章多任务和多线程

    第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程...

    Revit二次开发 c# 多线程处理

    为了解决这个问题,开发者通常会借助C#语言的多线程技术来提升效率。本文将深入探讨如何在Revit中实现C#的多线程处理,并通过实例和源代码来阐述这一过程。 首先,我们需要理解Revit的API限制。Revit不允许在非主线...

    易语言多线程传递多参数

    在编程领域,多线程是实现并发执行任务的重要机制,特别是在易语言中,它能有效提升程序的执行效率。易语言是一种中文编程语言,旨在降低编程门槛,让普通用户也能进行程序开发。本文将深入探讨易语言中的多线程以及...

    PB多线程实现

    二、PB12.5的多线程支持 PB12.5引入了对多线程的更好支持,它引入了一个名为“Worker Thread”的新概念。开发者可以创建一个工作线程对象,然后在这个对象上执行自定义的代码块。这使得在PB应用中实现多线程变得更加...

    多线程的运用e语言多线程 e多线程

    在编程领域,多线程是一种重要的并发执行机制,它允许程序同时执行多个任务,从而提高系统资源利用率和程序响应速度。E语言(可能是错误输入或者是某个特定编程环境或语言的简称)中的多线程功能也不例外。本文将...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程。本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。...

    多线程基础与基于多线程的简单聊天室

    本压缩包“多线程基础与基于多线程的简单聊天室”提供了对多线程技术的实践理解和二次开发的基础。以下是关于这个主题的详细知识点: 1. **多线程的概念**:多线程是指在一个程序中同时执行多个不同的线程,每个...

    c#多线程编程实战(原书第二版)源码

    《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...

    Delphi多线程详解_delphi_delphi多线程_多线程_

    在编程领域,多线程是一种常见且强大的技术,它允许应用程序同时执行多个任务,从而提高程序的效率和响应性。Delphi,作为一个流行的Object Pascal开发环境,提供了丰富的工具和库来支持多线程编程。本篇文章将深入...

    java 多线程操作数据库

    ### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...

    稳定、方便、实用的VB6多线程技术(附老马的ActiveX多线程示例)

    VB6中的多线程主要通过两种方式实现:一是使用Microsoft的ActiveX EXE组件,二是通过API函数进行底层操作。下面将详细介绍这两种方法。 1. **ActiveX EXE组件**: 微软官方提供了ActiveX EXE组件,这是一种支持多...

    利用VB6实现多线程

    二、VB6实现多线程 在VB6中,创建多线程主要依靠ActiveX EXE组件。这个组件允许我们创建一个独立的线程来运行特定的代码,而不会阻塞主应用程序的执行。 1. 创建ActiveX EXE工程 首先,我们需要创建一个新的...

    java多线程编程(第二版)

    《Java多线程编程(第二版)》这本书深入探讨了这一主题,旨在帮助开发者更好地理解和应用Java的并发特性。 在Java中,多线程允许程序同时执行多个任务,提高应用程序的效率和响应性。核心概念包括线程的创建、同步...

    Visual Basic 6.0建立多线程程序就是这么简单

    #### 二、多线程简介 多线程是指在单个进程中创建并运行多个独立执行单元的技术。每个线程可以并发执行不同的任务,从而提高程序的整体性能。在VB6中,可以通过调用Windows API函数或利用计时器(Timer)控件来实现多...

    Android多线程文件上传

    在Android应用开发中,文件上传是一项常见的任务,尤其是在处理大文件或者需要提高用户交互体验时,多线程技术显得尤为重要。本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程...

    Linux系统下的多线程编程入门.pdf

    在Linux系统下进行多线程编程是开发高效并发应用程序的关键技术之一。本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程...

    实验二、嵌入式Linux多线程编程实验

    实验二的目的是让学生深入理解嵌入式Linux环境下的多线程编程,这涉及到对线程概念、创建和管理的理解,以及如何在编程中引入线程库。线程是操作系统资源调度的基本单位,允许在一个进程中并发执行多个执行路径,...

    深入浅出 Java 多线程.pdf

    二、多线程编程的优点 多线程编程有以下几个优点: 1. 提高程序的执行效率:多线程编程可以同时执行多个任务,从而提高程序的执行效率。 2. 提高程序的响应速度:多线程编程可以提高程序的响应速度,因为它可以...

Global site tag (gtag.js) - Google Analytics