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 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
随机推荐
- Quick StateMachine状态机
状态机quick中是一个亮点,假设我们做一款RPG游戏,一个角色通常会拥有idle,attack,walk.run,death这些状态,假设游戏角色的状态採用分支条件推断的话.会造成很庞大而难以维护. ...
- Java乔晓松-android中上传图片到服务器Tomcat(Struts2)
在做android开发的时候,有时你会用到图片的上传功能,在我的android项目中,我是选中图片,点击上传多张图片 android客户端上传图片部分的代码如下: package com.exampl ...
- twisted是python实现的基于事件驱动的异步网络通信构架。
网:https://twistedmatrix.com/trac/ http://www.cnblogs.com/wy-wangyan/p/5252271.html What is Twisted? ...
- ffmpeg架构和解码流程分析
转 一,ffmpeg架构 1. 简介 FFmpeg是一个集录制.转换.音/视频编码解码功能为一体的完整的开源解决方案.FFmpeg的 开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用 ...
- 光谱郑匡移动互联网O2O完美融合
移动互联网尽管市场颇大,前景广阔,可是由于数据过于密集,非常难精准的定位所谓的目标客户群,然而O2O的线下市场却与互联网市场有极大的反差.一直认为高校周边的小商家是最幸福的生意人,客户明白(就是本校学 ...
- Streak OpenCart 商城自适应主题模板 ABC-0010
兼容浏览器 IE9, Firefox, Safari, Opera, Chrome OpenCart版本号 OpenCart 1.5.x, OpenCart 1.5.6.x, OpenCart 1.5 ...
- C#并行编程
C#并行编程中的Parallel.Invoke 一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过 ...
- 完全背包(南阳oj311)(完全背包)
全然背包 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 直接说题意,全然背包定义有N种物品和一个容量为V的背包.每种物品都有无限件可用. 第i种物品的体积是c.价值 ...
- JSP 获得Spring 注射对象
<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils"%&g ...
- 【从翻译mos文章】不再用par file如果是,export or import 包含大写和小写表名称表
不再用par file如果是,export or import 包含大写和小写表名称表 参考原始: How to Export or Import Case Sensitive Tables With ...