A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Y_Y 中级黑马   /  2013-10-29 10:09  /  1442 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

假设创建了2个线程t1,t2
执行

...........省略......
t1.run();
t2.run();
...........省略......
就这两句话,是t1执行完成后再执行t2,还是t1t2一同执行? 如果不是同时执行,有神马办法让他们同时执行

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

6 个回复

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

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
/*
进程:是一个正在执行中的程序
                每一个进程执行都有一个执行顺序,该顺序是一个执行路劲,或者叫一个控制单元

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

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

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!");
                }
        }
}

评分

参与人数 1黑马币 +3 收起 理由
黄炳期 + 3 得答到点子上哦!

查看全部评分

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

另外,线程开始执行是t1.star方法。而不是run方法。这点比较容易混。
回复 使用道具 举报
要并发执行的话,前面的线程用 start 方法,另外我感觉楼上说法不对,start 本质还是 run 方法,只是有额外功能:带着下一条线程一起跑
回复 使用道具 举报
To 金牌黑马 2013-10-29 21:42:58
7#
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马