java多线程学习(两)——创建一个线程
一个、java创建两个线程的方法
1、从java.lang.Thread派生一个新类线程类,其覆盖run()方法
2、实现Runnable接口。重载Runnable接口中的run()方法。
使用Thread类来创建线程和创建普通类的对象的操作是一样的,线程是Thread类或者其子类的实例对象。
二、java提供的两种创建线程的差别
java中类是单继承的,当定义一个新的线程类的时候。它仅仅能扩展一个外部类。那么当创建的线程是继承自Thread类来实现的,那么此线程类无法再扩展其它类,无法实现复杂的功能。此时,自己定义的线程类假设要扩展其它类,那么能够实现Runnable接口来实现线程类的功能,同一时候又能够扩展其它外部类。避免单继承带来的局限性。
同一时候。实现Runnable接口的方式创建的线程能够处理同一资源,从而实现资源的共享。
三、线程的创建
(1)由Thread类派生
由Thread派生出来的线程类。直接new就可以。
比如:
package com.thread.demo; public class JavaThreadDemo { /**
* @param args
*/
public static void main(String[] args) {
MutliThread m1 = new MutliThread("window 1");
MutliThread m2 = new MutliThread("window 2");
MutliThread m3 = new MutliThread("window 3");
m1.start();
m2.start();
m3.start();
} } class MutliThread extends Thread {
private int ticket = 100; MutliThread(String name) {
super(name);
} public void run() {
while(ticket > 0) {
ticket--;
System.out.println(ticket +" is saled by " + Thread.currentThread().getName());
}
}
}
上面的样例中由Thread类派生出的MutliThread类,在main()方法中new了三个线程类,并调用线程类的start方法来执行线程。三个线程并发的执行。
有输出结果能够看出。
(2)实现Runnable接口
创建的类假设实现了Runnable接口,则须要使用Thread的构造方法来创建线程。
比如:
package com.thread.demo; public class JavaThreadDemo { /**
* @param args
*/
public static void main(String[] args) {
TestRunnable test1 = new TestRunnable("张三");
TestRunnable test2 = new TestRunnable("李四"); Thread t1 = new Thread(test1);
Thread t2 = new Thread(test2); t1.start();
t2.start(); } } class TestRunnable implements Runnable {
private String name; TestRunnable(String name) {
this.name = name;
} @Override
public void run() {
for(int i = 0; i < 5; i++) {
try {
Thread.sleep(50);//模拟耗时操作
System.out.println(name + ":" + i); } catch (InterruptedException e) {
e.printStackTrace();
}
} }
}
上面的样例中TestRunnable实现了Runnable接口,并重载了当中的run()方法,在run()方法中模拟了耗时操作。
在main()方法中,首先创建了两个TestRunnable的实例,接着调用Thread的构造方法来创建了两个线程类,最后调用线程的start()方法来执行线程。这两个线程并行执行,能够看到输出结果为
每次的输出结果都不同,由于线程的执行是不确定的。随机器和执行的状态而变化。
四、线程中须要注意的一些小问题:
1、每一个线程都有自己的名字。假设不明白指定名字。那么线程的名字由虚拟机自己分配。
主线程的名字总是main。非主线程的名字不确定,视虚拟机分配的名字而定。
全部的线程(包含主线程main)的名字都能够设置和获取它的名字。
2、获取当前线程的对象的方法:Thread.currentThread();
3、线程的运行并非按某种顺序而运行的。对于不论什么一组启动的线程来说,调度程序不能保证其运行顺序,持续时间也无法确定,上面的线程样例中。每次运行的结果都不同,正好能够说明这一点。
4、线程的run()方法执行完成,则此线程结束。一个可执行的线程或者死线程能够被又一次启动。
5、线程的调度是JVM上的一部分。在一个CPU的机器上,实际上一次仅仅能执行一个线程。一次仅仅有一个线程栈执行。JVM线程调度程序决定实际执行那个处于可执行状态的线程。
可执行状态线程被选择的顺序是不确定的。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
java多线程学习(两)——创建一个线程的更多相关文章
- Java多线程学习(八)线程池与Executor 框架
目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...
- Java多线程学习(五)线程间通信知识点补充
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
- Java并发学习之中的一个——线程的创建
本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.与每一个Java语言中的元素一样,线程是对象.在Java中,我们有两种方式创建线程: a.通过直接继承thread类,然后覆盖run方法. b ...
- JAVA多线程学习八-多个线程之间共享数据的方式
多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...
- Java多线程学习——死锁的一个容易理解的例子
发生死锁的情况:多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况 public class Mirror { //镜子 } public class Lipstick { //口红 } ...
- java多线程学习-多个线程访问对象共享数据的方式
public class MulitThreadShareData { public static void main(String[] args) { final ShareData1 data1 ...
- Java多线程学习(六)Lock锁的使用
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
- Java多线程学习(四)等待/通知(wait/notify)机制
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79690279 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- [Java多线程]-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java多线程01(Thread类、线程创建、线程池)
Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
随机推荐
- Android学习笔记(四十):Preference使用
Preference从字面上看偏好,译为首选项. 一些配置数据,一些我们上次点击选择的内容.我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preference这 ...
- 通常编译亲测56Y国际象棋源代码,精仿56Y国际象棋完整的源代码下载!
今天公布亲测通常应编译56Y国际象棋源代码,精仿56Y牌源代码.喜欢的能够拿去研究.论坛资源太多.我们会把好的资源都公布出来,同一时候欢迎很多其它的程序猿增加我们! 增加我们的共同学习交流! ...
- 【深入浅出jQuery】源码浅析--整体架构(转)
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 如何设置一个activity透明(转)
1.在AndroidManifest.xml文件中设置: ? 1 android:theme="@android:style/Theme.Translucent 此代码固定为全背景透明. 2 ...
- Google Maps Android API v2 (2)- 地图对象
地图对象 Android的谷歌地图API允许你在你的Android应用程序中显示谷歌地图.在谷歌地图移动(GMM)的应用程序,你看到的地图,这些地图具有相同的外观和API暴露出许多相同的功能.GM ...
- Mvc后台接收 参数
@Html.TextAreaFor(m => m.Emps, new { @class = "easyui-validatebox", @style = "heig ...
- 重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom
原文:重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom [源码下载] 重新想象 Windows 8 Store Apps (13) - 控件之 Sem ...
- 图的创建和遍历(BFS/DFS)
图的表示方法主要有邻接矩阵和邻接表.其中邻接表最为常用,因此这里便以邻接表为例介绍一下图的创建及遍历方法. 创建图用到的结构有两种:顶点及弧 struct ArcNode { int vertexIn ...
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...
- iframe页面控制父页面跳转
<script> window.onload=function(){ window.location.href="http://www.baidu.com"; ...