时间: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.
*/