黑马程序员技术交流社区

标题: java 创建线程 [打印本页]

作者: Y_Y    时间: 2013-10-29 10:09
标题: java 创建线程
假设创建了2个线程t1,t2
执行

...........省略......
t1.run();
t2.run();
...........省略......
就这两句话,是t1执行完成后再执行t2,还是t1t2一同执行? 如果不是同时执行,有神马办法让他们同时执行
作者: FFF    时间: 2013-10-29 10:23
是t1执行完成后再执行t2,还是t1t2一同执行? 如果不是同时执行,有神马办法让他们同时执行?
问题1:不是执行完成T1后再执行T2,而是启动T1线程后,再启动T2线程。两个线程与主线程一起。共三个线程"抢"系统的执行权。谁抢到了,谁执行。执行完了,接着抢。
问题2:不可能同时执行。这个问题有必要说一下多线程的概念。
并发:进程是并发运行的,OS将时间划分为很多时间片段(时间片),尽可能均匀分配给正在运行的程序,微观上进程走走停停,宏观上都在运行,这种都运行的现象叫并发,但是,并不是绝对意义上的"同时发生"。
多线程:多线程就是一个进程中并发执行的多个子程序流。这样可以大大提高CPU的使用率。

作者: 靓仔    时间: 2013-10-29 10:43
/*
进程:是一个正在执行中的程序
                每一个进程执行都有一个执行顺序,该顺序是一个执行路劲,或者叫一个控制单元

线程:就是进程中的一个独立的控制单元
          线程在控制着进程的执行

一个进程中至少有一个线程

java vm启动的时候会有一个进程java.exe

该进程中至少有一个线程负责java程序的执行
而且这个线程运行的代码存在晕main方法中
该线程称之为主线程

扩展:其实更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程

1:如何在自定义的代码中,自定义一个线程呢?
        通过api的查找,java已经提供了对线程这类事物的描述,就是Thread类

创建线程的第一种方式:继承Thread类。
步骤:
1:定义继承Thread
2:复写Thread类中的run方法
        母的:将自定义的代码存储在run方法中,让线程运行
3:调用start方法。该方法有两个作用
        1:启动线程
        2:调用run方法。
发现结果每一次都不同
因为多个线程都获取cpu的执行权,cpu执行到谁,谁就执行
明确一点:在某一个时刻,只能有一个程序在运行(多核除外)
cpu在做着快速的切换,以达到看上去是同时运行的效果
我们可以形象吧多线程的运行行为成为在互相抢夺cpu的执行权

这就是多线程的一个特性:随机性,谁抢到谁先执行,至于执行多次时间cpu说的算。


为什么要覆盖run方法呢?

Thread类用于描述线程
该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法
也就是说Thread类中run方法,用于存储功能。
*/
class Demo extends Thread
{
        public void run()
        {
                for(int x = 0; x<50;x++)
                {
                        System.out.println(" x= "+x);
                }
        }
}
class ThreadDemo
{
        public static void main(String[] args)
        {
                        Demo d = new Demo();
                        d.start();//开启线程执行该线程run方法
                        //d.run()仅仅是对象调用方法,而线程创建了并没有运行。
                        for(int x = 0;x<50;x++)
                {
                        System.out.println("hello word!");
                }
        }
}

作者: 靓仔    时间: 2013-10-29 10:44
希望能帮到你吧
作者: 那得好好想想    时间: 2013-10-29 10:46
你这个t1和t2现在不是同步执行的,执行顺序是随机的。
你所说的同步是什么意思呢?是同时执行某一个方法?还是一起开始执行,然后一起结束。
目前我理解的同步是线程对数据的共享,这样不会导致不同线程之间的线程操作程序,导致数据不统一。
我估计你是指的一起开始,一起结束,那么这里有一个需要理解的是,cpu在处理线程的时候,始终都是一个一个处理的,不可能同时完全处理两个,由于处理速度非常快,所以近似同时处理,也就是逐个处理的,所谓的同步就是不破坏数据和程序逻辑,那么只要加入同步代码块就可以解决问题。这是我个人的理解。

另外,线程开始执行是t1.star方法。而不是run方法。这点比较容易混。

作者: 零下五度的水    时间: 2013-10-29 11:32
要并发执行的话,前面的线程用 start 方法,另外我感觉楼上说法不对,start 本质还是 run 方法,只是有额外功能:带着下一条线程一起跑
作者: To    时间: 2013-10-29 21:42
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2