关于实现Runnable接口创建线程的测试问题,如图

图片说明

0

5个回答

首先,两个线程使用的runnable对象是相同的,不考虑寄存器等缓存的因素,可以认为两个线程中看到的i是相同的,都是runnable对象的一个属性。
其次,线程宏观上并行,但微观上不一定,和CPU的核数以及当前CPU的线程负载有关,所以常常有同一进程内线程交替执行的情况。为了保证程序的正确性,对于临界资源常常需要加锁。

对于你的测试情况,可能的运行流程之一是:
thread 1 (i=0 -> 20) [wait] -> thread 2 (i = 21-> 100) [destroy] -> thread 1 (i=100) [destroy]
即你所说的“在线程1准备输出20的时候换到了线程2执行,执行完线程2后再执行线程1,因为线程1是执行了输出语句,只是在显示到控制台的路上”

如果你想验证线程的切换,建议可以这样试一下:
使用两个属性i,j,两个线程分别写其中一个,然后分别在两个线程中观察两个属性值。即:
thread 1:
i++; print i, j
thread 2:
j++; print i, j

4

你的for循环便利是小于100,最大是99,况且线程保持独立性,不会被其他线程所共享

0
smile_life_
smile_life_ 实现了runnable接口,线程1和线程2 负责的都是同一个对象,也就是说i是共享的才对
一年多之前 回复

线程交替获得cpu时间片,线程1先执行,故会出现线程1先执行完成的可能。谢谢。

0
smile_life_
smile_life_ 也就是说 i 变量是这两个线程共享的,线程1变化了 i 变量的值,线程2再去运行,那么i 就是变化后的值
一年多之前 回复
smile_life_
smile_life_ 我想问的问题在图片里面,为什么输出的是20,是不是在线程1准备输出20的时候换到了线程2执行,执行完线程2后再执行线程1,因为线程1是执行了输出语句,只是在显示到控制台的路上,这个时候i值的任何变化都与线程1的输出语句无关了?
一年多之前 回复

new了两个线程,两个线程每次只有一个执行,且随机的

0

你理解错了,不是一个线程对象,你new了两个Thread,虽然传入的是同一个Runnable实现类对象,但是实际运行的是两个互不相干的线程,i变量也是每个线程一份的

-1
smile_life_
smile_life_ 也就是说 i 变量是这两个线程共享的,线程1变化了 i 变量的值,线程2再去运行,那么i 就是变化后的值
一年多之前 回复
smile_life_
smile_life_ 除了有重复之外,这两个线程的i变量是连续的,通过断点调试也可以知道。也就是说图中的方式是多个线程可以共享线程的target类的实例变量
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
实现Runnable接口创建线程
Java语言是一种单继承,多实现的面向对象的语言          自定义线程的的方式:         方式1:             1. 自定义一个类,继承Thread类             2. 重写Thread类里边的run方法,把线程的功能代码放入到run方法中             3. 创建自定义线程类对象             4. 开启线程,使用start方法    ...
多线程中实现Runnable接口的好处
1.避免了继承Thread类的单继承的局限性。2.Runable接口出现更符合面向对象,将线程单独进行对象的封装。3.Runnable接口出现,降低了线程对象和线程任务的耦合性。所以创建线程的方式都使用Runnable接口。...
多线程——创建线程方法之二(实现Runnable接口)
/* 需求:简单的卖票程序。 多个窗口同时买票。 创建线程的第二种方式:实现Runable接口 步骤: 1,定义类实现Runnable接口 2,覆盖Runnable接口中的ru n方法。 将线程要运行的代码存放在该run方法中。 3,通过Thread类建立线程对象。 4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。 为什么要将Runnable接口的子类对
通过实现Runnable接口创建线程
实现runnable接口来创建线程类 创建Runnable实现类的对象 以Runnable实现类的对象作为thread的目标target来创建Thread对象 package newThread;public class Twothread implements Runnable { private int i; @Override public void run() {
Java实现Runnable接口创建多线程
Java实现Runnable接口创建多线程 通过继承Thread类,实现多线程,但是,这种方式有一定的局限性,因为,Java中只支持单继承,一个类一旦继承了某个父类,就无法再继承Thread类 比如,学生类Student继承了Person类,就无法通过继承Thread类,创建线程 针对这种情况,Thread类提供了另外一个构造方法Runnable target 其中,Runnable是一个...
线程:创建线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。代码如下:
线程:创建线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。代码如下: /** 创建一个线程, 类似于四个窗口,卖200张票。 */ class ThreadTest  { public static void main(String[] args)  { Thread th1=new Ticket(); Thread th2=new Ti
实现Runnable接口的类+使用Thread类的实例来创建线程---->通过实现Runnable接口来创建线程类
通过实现Runnable接口来创建线程类 public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);   Thread mThread = new Thread(u
使用Runnable接口的方式创建线程
实现步骤: (1)定义MyRunnable类实现java.lang.Runnable接口,并实现Runnable接口的run()方法,在run()方法中输出数据。 (2)创建线程对象。 (3)调用start()方法启动线程。package cn.run.test; //通过实现Runnable接口创建线程 public class MyRunnable implements Runnable { ...
细说继承Thread类和实现Runnable接口来创建线程的区别
创建线程有两种方法,一种是继承Tread类,另一种是继承Runnable接口继承Tread类MyThread extends Thread{ @overwrite public void run(){ 业务流程 } } public static void main(String[] args){ MyThread mt = new MyTread();
多线程(创建线程-实现Runnable接口)
/* 需求:简单的卖票程序。 多个窗口同时买票。 创建线程的第二种方式:实现Runable接口步骤: 1,定义类实现Runnable接口 2,覆盖Runnable接口中的run方法。 将线程要运行的代码存放在该run方法中。3,通过Thread类建立线程对象。 4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。 为什么要将Runnable接口的子类对象传
使用Runnable创建线程共享资源
packagecom.bjsxt.thread.create; /** *方便共享资源 *@authorAdministrator * */ publicclassWeb12306implementsRunnable{ privateintnum=50; @Override publicvoid...
JAVA中通过实现Runnable接口来创建线程类
// 通过实现Runnable接口来创建线程类 public class SecondThread implements Runnable { private int i ; // run方法同样是线程执行体 public void run() { for ( ; i < 100 ; i++ ) { // 当线程类实现Runnable接口时, // 如果想获取当前线程,
通过实现Runnable接口来创建线程
1、布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id
对于通过继承Thread类和实现Runnable接口这两种方式来创建线程的理解(含少量源码分析)
文章目录举例说明如何通过这两种方式创建线程继承Thread类创建线程类实现Runnable接口创建线程从源码角度分析以上两种方法继承Thread实现Runnable两种方式所带来的不同 举例说明如何通过这两种方式创建线程 继承Thread类创建线程类 public class FirstThread extends Thread { int i = 0; //不同线程对象不能共享该成员变量 ...
Java创建线程(Runnable接口和Thread类)
Java创建线程(Runnable接口和Thread类) 大多数情况,通过实例化一个Thread对象来创建一个线程。Java定义了两种方式: 实现Runnable 接口; 可以继承Thread类。 下面的两小节依次介绍了每一种方式。 实现Runnable接口 创建线程的最简单的方法就是创建一个实现Runnable 接口的类。Runnable抽象了一个执行代码单元
使用继承Thread类以及使用实现Runnable接口作为线程的比较
a.       Thread为一个类,继承Thread类之后不能再继承其他的类;Runnable为接口,实现Runnable接口的类仍然可以继续继承其他类; b.       继承Thread类的线程类中的实例属性是不能共享的,但Runnable接口的实现类的对象可以作为一个target放入多个Thread从而实现实例属性的共享,这一点多用于多个线程同时处理同一个对象。 c.  ...
对于多线程类 实现Runnable接口和继承Thread类有什么区别
一个类要想具备多线程能力。必须继承Thread类或者实现Runnable方法。 二者区别: 由于在Java中类和类之间是单继承的,一个类如果继承了Thread类就不能再继承其他类了,但是如果一个类实现了Runnable接口,则不妨碍它继承其它类。也就是说实现Runnable的类的扩展能力强。 继承Thread类,多线程之间不能共享同一对象。实现Runnable接口的类,可以在多线程情况下
继承Thread类与实现Runnable接口创建线程对于类实例变量共享的区别
1、继承Thread类  1)以继承Thread类的方式来创建线程,多个线程之间是不会共享类的实例变量的,当然肯定会共享类变量。下面通过一个例子来看一下:public class Ex1 extends Thread{ public Ex1(String name){ super(name); } private int i=0; public void run(){ i++; ...
通过继承Thread类和通过实现Runnable接口 创建线程的区别
通过继承Thread类和通过实现Runnable接口 创建线程的区别继承方式: 1.Java中类是单继承的,如果继承了Thread了,该类就不能再被其他类继承了 2.从操作上分析,继承方式更简单,获取线程名字也简单 3.从多线程共享同一个资源上分析,继承方式不能做到 实现方式: 1.Java类中可以多实现接口,此时该类可以继承其他类,并且可以实现其他接口。设计上更优雅。 2.从操作上分析
Java并发:创建线程的两种方法:继承Thread类和实现Runnable接口(一)
【1】了解进程与线程的概念 进程是一个程序在其自身的地址空间中执行一次活动,是资源申请、调度和独立运行的单位。 线程是进程中的一个单一的连续控制流程,一个进程可以包含一个或多个线程。 如果要在一个程序中实现多段代码同时交替运行,就需要产生多个线程,并指定每个线程上要运行的程序代码段,这就是多线程。 当程序运行时,就自动产生了一个线程,主函数main就是在这个线程上运行的,当不再产生新的线程时,...
线程的两种实现,为什么使用runnable接口的居多
一、线程实现的两种方式    1、继承Thread成为线程类;    2、实现Runnable接口,成为线程任务类。二、Thread类部分源码 * @author unascribed * @see Runnable * @see Runtime#exit(int) * @see #run() * @see #stop() * @since JDK1...
多线程Thread类和Runnable接口资源共享问题分析
最近在看多线程时,一直迷茫为什么继承Thread类的多线程不能实现资源共享,但是实现Runnable接口的多线程却能实现资源共享,先看一段经典的卖票多线程,将程序修改一下,使运行结果直观。 首先是实现Runnable接口来实现多线程:public class TicketSaleMain implements Runnable{ private int num = 5;
线程Runnable接口使用 start()方法
话不多说,上代码import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class thread implements Runnable { @Override public void run()
JAVA中使用Thread类和Runnable接口创建多线程
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。
使用Runnable接口实现线程的方法
用Runnable接口实现线程的方法主要有两点好处:     1.java中是不允许多继承的,但用Runnable接口实现线程的创建可以间接的实现多继承     2.具有共享性 (推荐使用这种方法创建线程) 具体详细请看下面的例子:   public class TheadDeno {     public static void main(String[] args) {     ...
【多线程】JAVA——Runnable接口实现[一]
Runnable 利用实现Runnable接口来创建线程的方法可以解决JAVA语言不支持多重继承的问题。Thread类拥有众多的方法,而Runnable接口中只有唯一的一个run()方法原型,因此创建新线程类时,只要实现此接口,就可以开始新线程类的运行。 实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。过程如图: 利用Runnabl
实现Callable接口创建线程
创建执行线程有四种方式: 实现implements接口创建线程 继承Thread类创建线程 实现Callable接口,通过FutureTask包装器来创建线程 使用线程池创建线程 下面介绍通过实现Callable接口来创建线程。 package com.ccfdod.juc; import java.util.concurrent.Callable; import java.util....
【JAVA】创建线程的两种方式Thread与Runnable
                         创建线程的两种方式Thread与Runnable 一、简要说明 创建线程的两种方式,一是继承Thread类,二是实现Runnable接口,最后都是依据Thread类的构造方法实例化出一个线程对象,调用线程对象的start()方法,就可以通知线程启动了,在线程获取CPU的资源后,此时线程真正地按照run()方法内部的步骤运行起来了,执行完毕之后,...
java 创建线程的方法 继承Thread类和实现Runnable接口
要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;◆实现Runnable接口,重载Runnable接口中的run()方法。 具体步骤 1、扩展Thread类来创建线程 首先,需要通过创建一个新类来扩展Thread类,这个新类就成为Thread类的子类。接着在该子类中重写Thread类的run()方法,此时方法体内的程序就是将...
java之多线程中Thread类和Runnable接口使用方法
java提供了两种线程方式,一种是继承java.lang包下的Thread类,覆写Thread类的run()方法,在run()方法中实现运行在线程上的代码!第二种是实现Runnable接口创建多线程。下面就跟大家具体的介绍一下这两种方式! 在学习多线程之前先来看看我们熟悉的单线程程序package bean; public class Example3_2 { public s
实现线程的方式 :1 继承thread类 2 实现runnable接口 3 实现Callable接口通过FutureTask包装器来创建Thread线程
1,继承线程类创建³线程 线程类本质上是实现了可运行接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过螺纹类的开始()实例方法。开始()方法是一个本机方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接延伸线程,并复写run()方法,就可以启动新线程并执行自己定义的运行()方法例如: public class MyThread extends ...
多线程之实现Runnable与继承Thread的区别
我在上一个博客说了两种实现多线程的方法,实现Runnable接口与继承Thread类,表面上看他们都没有什么区别,但在实际使用中继承Thread的较少,实现Runnable的较多。这说明他们之间还是有很大的区别的,下面我们看一下它们的区别:我们首先给他们设置一个环境,People是一个类它或者实现了Runnable接口或者继承了Thread类,同时他还有一个int属性代表他的血量,初始值是10,在...
实现Runnable接口来创建线程
package javawork; public class Example12_1 { //Thread(Runnable target)在创建线程对象是向构造方法的参数传递一个实现Runnable接口类的实例 //该实例对象称为所创建线程的目标对象,当线程调用start()方法时, //一旦轮到他来享用CPU资源,目标对象就会自动调用run()方法(接口回调),这一过程是自动实现的,...
java多线程------实现Runnable接口创建多进程,实现资源共享
//实现Runnable接口创建多进程,实现资源共享 package xian_cheng; public class Example05 { public static void main(String[] args) { // TODO Auto-generated method stub TickWindow tw=new TickWindow();//实例化对象tw ne
实现runnable接口创建线程
声明自定义线程类实现Runnable接口实现奇数/偶数序列线程并发执行。
通过实现runnable实现多线程操作
第一步:创建一个抽象类,实现runnable接口。public abstract class ThreadRun implements Runnable { @Override public void run() { doSomeThing(); } ThreadRun() { } public abstract void do...
使用Runnable接口创建线程和sleep方法
/*  时间:2015年3月11日20:42:02  测试的线程的创建和启动的另外一种方法:使用接口Runnable  同时测试了Sleep方法的使用  sleep(long)方法的声明如下:   public static void sleep(long millis)                   throws InterruptedException           
实现Runnable接口相对于继承Thread类的优点
适合多个相同程序代码的线程去处理同一个资源可以避免由于Java的单继承性带来的局限性增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
实现java多线程的3种方式
     之前也是只知道实现多线程有两种方式,继承Thread类和实现Runnable接口,今天看文章,发现有第三种方式,而且第三种方式优于前面两种。 1、继承Thread类,当然是最差的,因为Java是单继承,继承了一个类就不能继承另一个类了。 2、实现Runnable接口,Java可以实现多接口,所以优于第一种,但是重写run方法,run方法是void 无返回值。 3、实现Callabl...
创建线程的第二种方法:实现Runnable接口
package thread; public class ThreadDemo3 {  /**   * @线程示例:   * 需求:简单的卖票程序。   * 多个窗口卖票。   *   * 创建线程的第二种方式:实现Runnable接口   *   * 步骤:   * 1,定义类实现Runnable接口   *   //class Ticket implements Ru
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 关于大数据培训 关于云计算