菜菜鸟日记之多线程()

时间:2015年10月28日

地点:XXXX

作者:XXXXXXX

我叫某某某,我是一个菜鸟程序员,正在向成为一个合格的程序员的道路上努力学习前进。不过这是表面上隐藏我身份的面具,其实我是一个演员,不是说错了(最近为了仔细了解人类,看了太多的一种叫电影的很机密的秘密资料,所以有点条件反射),其实我是一个外星人,n年前,我星本来是要入侵这个名叫地球的小星球的。但是谨慎的我们派出了我的一个前辈来这里了解情报,幸好,不然我们就全军覆灭了,太险了。这是个神奇的地方,在哪个前辈的报告中,这里随便的一个人都可能在某种莫名其妙的情况下去到某个地方,即使以我们的科技也都不知道那是哪里,要知道我们可是横跨好几个宇宙的大帝国,他们叫这个是穿越。还有随便的一个看起来很落拓的老大爷(不只是老大爷呀!!!)都可能是绝世高手,他们似乎都爱死皮赖脸的把自己的一身本事传给一些没啥本事又爱杀人全家的绰号叫屌丝的群体。那些人就会从此大杀四方,挥挥手就灭了某某星球,太凶残了。要知道即使是我们的宇宙作战单位,也要是主炮才有毁灭星球的能力,还有这个星球好像被毁灭过无数次,但是都会被一个叫英雄的群体给恢复,他们有的用一种珠子(好像叫龙珠什么的),有的用仙法什么的,太神奇了。这里有个叫R国的地方还是宇宙级怪兽的故乡,经常有怪兽回来,但都失踪了。。。。。还有看起来很普通的一个人都可能会是这个或那个神的私生子之类的。。这里的神据说无所不能。。。还有很多但我的级别不够,那位前辈带回的重要消息知道的不多,总之地球太危险了,我经常想回老家XXX星。

不过为了打入敌人内部,我会坚持到底的。嗯,我听说哪位前辈是在一个叫XX网吧的地方(干啥用的呢),用了两箱我们那遍地都是没啥用的金嘎达,这好像叫黄金的东西在一个什么XX网站的非常神秘的资料库里看到的。我也去过那,不过据附近的地球人说哪已经拆迁(拆迁是个啥?)了,一定是敌人隐藏了起来。不过没关系我会努力找到更多的有用的情报的

在XXX地址有   下回分解之小兵的报告。

星际小兵的报告:报告将军,我发现了一个秘密!!!!

你能看到上面的小说和下面的正文这就是多线程的两个程序,你就是cup你想看哪个就看那个。

如果你想看小说的下一回就是单线程。必须看完这个才能知道地址看下一个。(我没办法判断别人看完了再出现最后的下回分解,不然就像了)

什么是多线程:是指从软件或者硬件上实现多个线程并发执行的技术。

那什么是线程?

什么是线程:  每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。(百度百科)

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程  (好搜百科)

我个人的理解: 我们写的程序都在进程里跑,进程 本身是一个环境,它里边真正执行操作步骤的是线程 如果你的程序要执行的操作不止一个,那单线程的话会按顺序执行。比如算数加,减法(不是一个资源的,只是两个操作),如写的是先执行加法后减法。那程序会先执行完加法再执行减法,那加法出了点问题不会退出但会卡上1个多小时的时候呢,减法也得不到执行,如果减法只用不到一秒就完事呢?。如果是多线程的话,你可以让一个线程执行加法,一个线程执行减法,他们会分别执行,加法卡了,先执行减法,在等加法,至少可以能先完成的任务先完成(好想也没快?)。

我对线程的理解实在有限,就不班门弄斧了,说些我知道的吧很浅显。

在java中如何使用多线程那:

有两种方法:一个实现接口Runnable

Runnable接口只有一个run方法,作用是:(个人理解)就是新开的线程的main方法,线程开始自动执行该方法(但是要开始线程                                                      得用start方法,只有下面的Thread类才有这个方法,他本身没有)

方法:

一个要开启线程的类

public class Test implements Runnable {

    @Override
    public void run() {
      //测试用
      for (int i = 0; i < 10; i++) {
        System.out.println(i+"\t");
        if (i==2) {
            try {                  //睡眠状态
                Thread.sleep(100000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
      }
    }

}

开启一个线程

    public static void main(String[] args) {
        //第一个
        //Runnable test1=new Test()  ;
        Test test1=new Test();
        //Thread类有一个构造方法可传入一个Runnable接口的对象
        Thread th=new Thread(test1);

        th.start();

//   一个Native Method就是一个java调用非java代码的接口

一个是继承Thread类,该类实现了Runnable 接口

方法是:

public class Test2 extends Thread {

    @Override
    public void run() {
           //测试用
          for (int i = 0; i < 10; i++) {
            System.out.println(i+"\t");
            if (i==2) {
                try {
                    Thread.sleep(100000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
          }

    }

}

main方法中开启线程

        //第二个
        Test2 test2=new Test2();
        test2.start();

其实真正实现调用底层代码完成开启线程的是Thread类。Runnable接口是为了避免java中单继承的缺点和资源共享而存在的(个人理解,不保证对)

线程的状态:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。

引用自:http://blog.csdn.net/peter_teng/article/details/10197785

/*
    1.新建状态(New): 
        当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码

2.就绪状态(Runnable)

一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。

处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(thread scheduler)来调度的。

3.运行状态(Running)

当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法.

4. 阻塞状态(Blocked)

线程运行过程中,可能由于各种原因进入阻塞状态:
        1>线程通过调用sleep方法进入睡眠状态;
        2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
        3>线程试图得到一个锁,而该锁正被其他线程持有;
        4>线程在等待某个触发条件;
        ......

所谓阻塞状态是正在运行的线程没有运行结束,暂时让出CPU,这时其他处于就绪状态的线程就可以获得CPU时间,进入运行状态。

5. 死亡状态(Dead)

有两个原因会导致线程死亡:
        1) run方法正常退出而自然死亡,
        2) 一个未捕获的异常终止了run方法而使线程猝死。
        为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.

*/

时间: 2024-10-08 09:41:42

菜菜鸟日记之多线程()的相关文章

T4模板之菜菜鸟篇

一.废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎.在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件. 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段.生成的文件可以是任何类型的文本,例如网页.资源文件或任何语言的程序源代码.现在的VS中只要与代码生成相关的场景基本上都能找T4的身影,

菜菜鸟Zend Framework 2 不完全学习涂鸦(三)-- 例子功能设置

菜菜鸟Zend Framework 2 不完全学习涂鸦(三)-- 例子功能设置 这是涂鸦的第三篇,主要介绍一下ZF官网教程中所涉及的一些数据库方面的设置. 官网的教程时构建一个唱片的目录系统,包括唱片列表,增,删,改唱片信息. 注意:在开始教程之前,请确认: 1.是否已经打开了mod_rewrite功能 2.是否已经支持了 .htaccess 否则您除了访问首页之外将不能访问任何页面 一.系统功能设置 页面名称 页面功能说明 唱片列表(List of albums) 显示已有的所有唱片列表,同时

菜菜鸟Zend Framework 2 不完全学习涂鸦(四)-- 模块

菜菜鸟Zend Framework 2 不完全学习涂鸦(四)-- 模块 这是涂鸦的第四篇 模块(Modules) ZF2 是一个模块系统,而你需要在每个模块中组织你主要应用代码.由模板(skeleton)所提供的应用程序模块在整个应用程序中被用作引导(bootstrapping),错误(error)和路由设置(routing configuration).它经常被用作提供应用级别控制,例如,应用程序的首页.但是在这个教程中我们不使用默认的模块,我们将使用唱片列表来作为应用程序的首页. 我们将代码

黑马程序员-学习日记(多线程的初步认识)

 ------Java EE培训.Android培训.iOS培训.期待与您交流! ------- 进程:正在执行的应用程序.一个应用程序运行时内存分配的空间.线程:进程中一个程序执行的控制单元,一条执行路径.负责程序的执行顺序.多线程:在java虚拟机启动的时候会有一个java.exe的执行程序,即一个进程.该进程中至少有一个线程负责java程序的运行.而且这个线程运行的代码存在于main方法中. class Demo extends Thread { public void run() { f

黑马程序员-学习日记(多线程安全问题和死锁认识)

------Java培训.Android培训.iOS培训.期待与您交流! ------- 安全问题产生的原因: 当多条代码语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完, 另一个线程参与进来执行.导致共享数据的错误. class Mlpc implements Runnable { private int ticket = 50; public void run() { while(true) { if(ticket>0) { try { Thread.sleep(2

python菜鸟日记7

1. 如果直接在操作系统中进行命令行操作,那么一般使用的是操作系统所提供的接口函数,而如果想在python中也能够调用操作系统的接口函数来对文件,目录进行操作的话,可以使用os和os.path模块,这些模块可以直接调用操作系统提供的接口函数 2. >>>os.name ,name属性会反映出操作系统的一些信息,如果是posix,说明系统是Linux.Unix或Mac OS X,如果是nt,就是Windows系统,要获取详细的系统信息,可以调用uname()函数,注意uname()函数在W

黑马程序员-学习日记(多线程)

进程:正在执行的应用程序.一个应用程序运行时内存分配的空间.线程:进程中一个程序执行的控制单元,一条执行路径.负责程序的执行顺序. 多线程存在的意义: 程序运行中至少有两个线程在运行,一个是主函数的主线程,另一个是垃圾回收的线程. 线程创建方式一: 继承Thread类.要覆盖其run方法,调用线程的start方法. 作用:1.启动线程 2.运行run方法.目的是将自定义的代码存储在run方法中,让线程运行 cpu每次只执行一个程序,只是在快速的不同线程间切换,表现了多线程的随机性 class M

第一篇菜鸟日记

JAVASCRIPT学习简单的进度条源码 下面是一个简单的进度条的源码 html_id是你要显现在html上的id,lb_id是一个显示百分比文字的id,top为进度条最多是多宽,speed是速度. function PRG(html_id,lb_id,top,speed) { var a = 1; var s = 0; var _id = window.setInterval(function () { a = a++;if (s == top) { window.clearInterval(

python菜鸟日记8

1. python中的多进程编程概念:由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持.multiprocessing模块就是跨平台版本的多进程模块.multiprocessing模块提供了一个Process类来代表一个进程对象. 2. python中的多线程编程具体做法:当我们引入该multiprocessing模块后,对需要进行调用的函数创建进程:b= Process(target=函数名, args=(实参,)),因为process是一个类,所以b就是一个target函数的