一个、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多线程学习(两)——创建一个线程的更多相关文章

  1. Java多线程学习(八)线程池与Executor 框架

    目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...

  2. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  3. Java并发学习之中的一个——线程的创建

    本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.与每一个Java语言中的元素一样,线程是对象.在Java中,我们有两种方式创建线程: a.通过直接继承thread类,然后覆盖run方法. b ...

  4. JAVA多线程学习八-多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  5. Java多线程学习——死锁的一个容易理解的例子

    发生死锁的情况:多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况 public class Mirror { //镜子 } public class Lipstick { //口红 } ...

  6. java多线程学习-多个线程访问对象共享数据的方式

    public class MulitThreadShareData { public static void main(String[] args) { final ShareData1 data1 ...

  7. Java多线程学习(六)Lock锁的使用

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  8. Java多线程学习(四)等待/通知(wait/notify)机制

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79690279 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  9. [Java多线程]-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  10. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

随机推荐

  1. Hdu 5073 Galaxy 精度问题

    思路: 其实求解很简单直接说解法,移动K个后 上下的角动量最小,能肯定是相连的(n-k)个,至于为什么 你自己好好想想(easy): 对于一些等质量的质点中心在 所在位置和除以点的个数 average ...

  2. 当执行游戏0xc000007b错误的解决方法

    如图,这个错误使无数玩家烦恼. 出现这个错误,可能是硬件的问题,也可能是软件的问题.可是,因为硬件引起该问题的概率非常小,而且除了更换硬件之外没有更好的解决方法,因此本文将具体介绍怎样通过软件解决此问 ...

  3. 深挖BAT内部级别和薪资待遇,你敢看?(转)

    一. 阿里内部级别和薪资待遇 先看个例子,或许你也曾像他一样纠结 BAT 的 offer: 最近刚通过阿里面试,但基本薪酬也是不升反小降. 级别只有 P6+,连 P7 都没有,非常郁闷,打算拒绝算了. ...

  4. 《Linux内核设计与实现》的地址空间读书笔记的过程

    1.核心区域进程包括各种内存对象 种内存对象,比方: 1.可运行文件代码能够包括各种内存映射,称为代码段(text section). 2.可运行文件的已初始化全局变量的内存映射,称为数据段(data ...

  5. Linux 0.12 内核管理存储器

    Linux 0.12 内核管理存储器 其分段,用分段的机制把进程间的虚拟地址分隔开. 每一个进程都有一张段表LDT.整个系统有一张GDT表.且整个系统仅仅有一个总页表. 其地址翻译过程为: 程序中给出 ...

  6. 3D MAX脚本教程1

    本文转载自http://jiurong995294.blog.163.com/blog/static/195133243201192531546490/ 方便以后须要时候使用 为什么要学习3D MAX ...

  7. python 凸包(经纬度) + 面积[近似]

    def cross(A,B): return A[0] * B[1] - A[1] * B[0] def vectorMinus( a , b): return ( (a[0] - b[0] )*10 ...

  8. [原创] linux deepin 2014.1下编译putty

    在网上找了很久,都没有找到linux下直接可以用的putty程序,最终在putty官网找到了源代码 点击下载 把源代码下载回来. 1.下载源代码 2.安装依赖库 如果系统中没有安装过libgtk2.0 ...

  9. effective c++ 条款13 use object to manage resources.

    请求的系统资源需要最终还回系统,为了避免遗忘返还这个动作,可以利用析构函数在object销毁时自动调用的特点来实现. 简单说就是用object来管理资源. 以内存资源为例 class Investme ...

  10. SendMail如何签名

    MailAddress类有两个参数 第1个参数:发送者的邮箱 第2个参数:发送者的签名 示例: MailMessage message = new MailMessage();message.From ...