Java thread 怎么用_Java Thread 的使用
写俄罗斯方块游戏的时候用线程遇到一点问题。
如果一个类继承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 的使用相关推荐
- java join()源码_Java Thread的join() 之刨根问底
0.Join() 线程的合并的含义就是 将几个并行线程的线程合并为一个单线程执行,应用场景是 当一个线程必须等待另一个线程执行完毕才能执行时,Thread类提供了join方法来完成这个功能,注意,它不 ...
- java 暂停当前线程_Java Thread.Sleep()暂停当前线程
首页 > 基础教程 > 多线程 > Thread类 Java Thread.Sleep()暂停当前线程 Thread.sleep()被用来暂停当前线程的执行,会通知线程调度器把当前线 ...
- java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...
学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...
- java thread yield()_Java Thread yield()方法
Java Thread yield()方法 java.lang.Thread.yield() 方法使当前执行的线程对象来暂停并允许其他线程执行. 1 语法 public static void yie ...
- 【转】java线程系列---Runnable和Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- 【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 ...
- Java多线程的实现方式-Thread 类,Runnable 接口
在 Java 的 JDK 开发包中,已经自带了对多线程技术的支持,可以方便地进行多线程编程.实现多线程编程的方式主要有两种:一种是继承 Thread 类,另一种是实现 Runnable 接口.下面详细 ...
- Java并发编程实战~Worker Thread模式
在上一篇文章中,我们介绍了一种最简单的分工模式--Thread-Per-Message 模式,对应到现实世界,其实就是委托代办.这种分工模式如果用 Java Thread 实现,频繁地创建.销毁线程非 ...
- java dumpheap_java程序性能分析之thread dump和heap dump
一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...
- 【java】Thread.Sleep(0) 与 Thread.onSpinWait
1.概述 转载:Thread.Sleep 与 Thread.onSpinWait 2. Thread.Sleep 一般情况下,我们让线程等待一段时间都是使用Thread.sleep()命令.比如下面这 ...
最新文章
- leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)...
- 国际互联网协会(ISOC)提出未来互联网十项原则
- 漫画:崩溃了!!这程序是什么玩意儿!!!
- 在下列选项中,没有构成死循环的程序的是?
- web程序部署常见(404)错误
- VTK:图表之SelectedVerticesAndEdges
- C# 对Ini文件操作(C# ini文件操作类)
- hive编程指南_第三篇|Spark SQL编程指南
- 水凝胶 静电纺丝_离子液体/水和静电纺丝条件对聚偏氟乙烯纳米纤维晶体结构的影响...
- HttpServletRequest中文乱码
- 23.3. DELETE
- 多种方式判断PC端,IOS端,移动端
- ajax、axios、fetch之间的详细区别以及优缺点
- Cannot load driver ‘C:\Keil_v5\ARM\Segger\JL2CM3.dll 报错解决方法。
- 最全java面试题及答案(208道)
- 英语演讲和英语课件ppt模板
- 【浏览器强制360网页导航】360导航被强制设成首页如何取消?
- 【图文详解】环境变量中Path环境变量作用详解
- html画圣诞树—动态效果展示【炫酷合集】
- TCR历史期刊为何受大家欢迎?