写俄罗斯方块游戏的时候用线程遇到一点问题。

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

(附)start 和 run 方法解释:

1) start:

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

2) run:

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。

直接看代码:

1、继承Thread的demo

package com.multithread.learning;

/**

*多线程学习,继承Thread,资源不能共享

*@author

*/

class Thread1 extends Thread{

private int count=5;

private String name;

public Thread1(String name) {

this.name=name;

}

public void run() {

for (int i = 0; i < 5; i++) {

System.out.println(name + "运行 count= " + count--);

try {

sleep((int) Math.random() * 10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public class Main {

public static void main(String[] args) {

Thread1 mTh1=new Thread1("A");

Thread1 mTh2=new Thread1("B");

mTh1.start();

mTh2.start();

}

}

2、实现Runnable的demo

/**

*多线程学习 实现runnable,资源能共享

*@author

*/

package com.multithread.runnable;

class Thread2 implements Runnable{

private int count=15;

@Override

public void run() {

for (int i = 0; i < 5; i++) {

System.out.println(Thread.currentThread().getName() + "运行 count= " + count--);

try {

Thread.sleep((int) Math.random() * 10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public class Main {

public static void main(String[] args) {

Thread2 mTh = new Thread2();

new Thread(mTh, "C").start();//同一个mTh,但是在Thread中就不可以,如果用同一个实例化对象mt,就会出现异常

new Thread(mTh, "D").start();

new Thread(mTh, "E").start();

}

}

//这里要注意每个线程都是用同一个实例化对象,如果不是同一个,效果就和上面的一样了!

提醒一下大家:main方法其实也是一个线程。在java中所有的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。

在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个jvm,每一个jvm实际上就是在操作系统中启动了一个进程。

Java thread 怎么用_Java Thread 的使用相关推荐

  1. java join()源码_Java Thread的join() 之刨根问底

    0.Join() 线程的合并的含义就是 将几个并行线程的线程合并为一个单线程执行,应用场景是 当一个线程必须等待另一个线程执行完毕才能执行时,Thread类提供了join方法来完成这个功能,注意,它不 ...

  2. java 暂停当前线程_Java Thread.Sleep()暂停当前线程

    首页 > 基础教程 > 多线程 > Thread类 Java Thread.Sleep()暂停当前线程 Thread.sleep()被用来暂停当前线程的执行,会通知线程调度器把当前线 ...

  3. java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...

    学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...

  4. java thread yield()_Java Thread yield()方法

    Java Thread yield()方法 java.lang.Thread.yield() 方法使当前执行的线程对象来暂停并允许其他线程执行. 1 语法 public static void yie ...

  5. 【转】java线程系列---Runnable和Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  6. 【Android】java.lang.AssertionError use looper thread, must call Looper.prepare() first!异常分析

    java.lang.AssertionError: use looper thread, must call Looper.prepare() first! 在消息处理中必须先调用Looper类的pr ...

  7. Java多线程的实现方式-Thread 类,Runnable 接口

    在 Java 的 JDK 开发包中,已经自带了对多线程技术的支持,可以方便地进行多线程编程.实现多线程编程的方式主要有两种:一种是继承 Thread 类,另一种是实现 Runnable 接口.下面详细 ...

  8. Java并发编程实战~Worker Thread模式

    在上一篇文章中,我们介绍了一种最简单的分工模式--Thread-Per-Message 模式,对应到现实世界,其实就是委托代办.这种分工模式如果用 Java Thread 实现,频繁地创建.销毁线程非 ...

  9. java dumpheap_java程序性能分析之thread dump和heap dump

    一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...

  10. 【java】Thread.Sleep(0) 与 Thread.onSpinWait

    1.概述 转载:Thread.Sleep 与 Thread.onSpinWait 2. Thread.Sleep 一般情况下,我们让线程等待一段时间都是使用Thread.sleep()命令.比如下面这 ...

最新文章

  1. leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)...
  2. 国际互联网协会(ISOC)提出未来互联网十项原则
  3. 漫画:崩溃了!!这程序是什么玩意儿!!!
  4. 在下列选项中,没有构成死循环的程序的是?
  5. web程序部署常见(404)错误
  6. VTK:图表之SelectedVerticesAndEdges
  7. C# 对Ini文件操作(C# ini文件操作类)
  8. hive编程指南_第三篇|Spark SQL编程指南
  9. 水凝胶 静电纺丝_离子液体/水和静电纺丝条件对聚偏氟乙烯纳米纤维晶体结构的影响...
  10. HttpServletRequest中文乱码
  11. 23.3. DELETE
  12. 多种方式判断PC端,IOS端,移动端
  13. ajax、axios、fetch之间的详细区别以及优缺点
  14. Cannot load driver ‘C:\Keil_v5\ARM\Segger\JL2CM3.dll 报错解决方法。
  15. 最全java面试题及答案(208道)
  16. 英语演讲和英语课件ppt模板
  17. 【浏览器强制360网页导航】360导航被强制设成首页如何取消?
  18. 【图文详解】环境变量中Path环境变量作用详解
  19. html画圣诞树—动态效果展示【炫酷合集】
  20. TCR历史期刊为何受大家欢迎?

热门文章

  1. 关于Kendo UI 开发教程
  2. HDFS的java API操作(基于Windows平台的Eclipse)
  3. iOS 证书, provision profile作用
  4. YYYY-mm-dd HH:MM:SS 备忘录
  5. PL/SQL 调用JAVA使用UDP发送数据
  6. JS - Object and Property的删除用法
  7. Orchard是如何运行的
  8. AS3 JPEG Encoder应用:从Flash中保存图片
  9. Android Fragment-APP调用其他APP中的Fragment 1
  10. 华三 h3c交换机MSTP配置