一个、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. WPS2012交叉引用提示word比wps这种强烈的更新参考

                WPS2012交叉引用技巧,word比wps这点强更新參考文献 到时生成仅仅有有一条线,好像WPS不能够,word能够,假设谁知道能够补充.^_^ 1.写论文,參考文献的改动非 ...

  2. 协同编辑多人word一个小技巧文件

    协同编辑多人word窍门 近期在工作中编写标书时因为不同内容分给了各个部门去制作.可是在汇总后遇到再次改动的问题.对方把改动后的部分文档发给我粘贴到标书中后,所有的格式所有都乱了.又一次整理格式.标题 ...

  3. MVC Razor视图引擎控件

    0.日期转化

  4. kNN(K-Nearest Neighbor)最近的分类规则

    KNN最近的规则,主要的应用领域是未知的鉴定,这一推断未知的哪一类,这样做是为了推断.基于欧几里得定理,已知推断未知什么样的特点和最亲密的事情特性: K最近的邻居(k-Nearest Neighbor ...

  5. 数据结构读书笔记(二)(C语言)

    (一)循环链表 存储类型 typedef struct LNode { ElemType data; struct LNode *next; }; typedef struct LNode *Link ...

  6. adapter pattern

    对象适配器 9.7 适配器模式总结 适配器模式将现有接口转化为客户类所期望的接口,实现了对现有类的复用,它是一种使用频率非常高的设计模式,在软件开发中得以广泛应用,在Spring等开源框架.驱动程序设 ...

  7. WPF动态加载3D 放大-旋转-平移

    原文:WPF动态加载3D 放大-旋转-平移 WavefrontObjLoader.cs 第二步:ModelVisual3DWithName.cs public class ModelVisual3DW ...

  8. IMP-00013 目前只有 DBA 其他导入能力 DBA 导出的文件

    --实例演示 ---system用户导出 C:\Users\ZML>exp system/zml file='D:\zml.dmp' log = 'D:\zml.log' tables = (z ...

  9. 采用objdump调试驱动程序

    最近的一个推断调整nand是好是坏司机+测试程序,因此,与下面的调整过程.看来他也学到了一点知识.因此,关于备案. 这篇文章主要是讲述调式驱动的一个方法而已. 先来看看測试程序 #include &l ...

  10. earlysuspend调用过程

    1. 电源管理的状态 Android的Linux内核为系统提供了4种电源状态,内核的源码为当中的3种定义了名字和相应的宏定义,名字定义在kernel/power/suspend.c中: constch ...