[转]java多线程例子

1.  代码实例

这里我们做一个完整的例子来说明线程产生的方式不同而生成的线程的区别:

package com.example.ThreadTestDemo;

public class ThreadTest extends Thread {
  public static void main(String[] args) throws Exception{

    for(int i=0;i<10;i++){
      Thread t = new MyThread();
      t.start();
    }
    Thread.sleep(10000);    //让上面的线程运行完成
    R r = new R();
    for(int i=0;i<10;i++){
      Thread t = new Thread(r);
      t.start();
    }
  }
}

class MyThread extends Thread{
    public int x = 0;

    public void run(){
      System.out.println(++x);
    }
  }

  class R implements Runnable{
    private int x = 0;
    public void run(){
      System.out.println(++x);
    }
  }

输出结果为:1 1 1 1 1 1 1 1 1 1

1 2 5 4 3 8 10 7 6 9

上面10个线程对象产生的10个线程运行时打印了10次1。下面10个线程对象产生的10个线程运行时打印了1到10。我们把下面的10个线程称为同一实例(Runnable实例)的多个线程。

2.  线程对象的几个重要方法

1. start方法

一个线程对象生成后,如果要产生一个执行的线程,就一定要调用它的start()方法。在介绍这个方法时不得不同时说明run方法。其实线程对象的run方法完全是一个接口回调方法,它是你这个线程对象要完成的具体逻辑。简单说,你要做什么你就在run方法中完成。而如何做,什么时候做就不需要你控制了,你只要调用start方法,JVM就会管理这个线程对象让它产生一个线程并注册到线程管理系统中。

从表面上看,start()方法调用了run()方法,事实上并没有直接调用run方法。在JDK1.5以前start()方法是本地方法,它如何最终调用run方法已经不是JAVA程序员所能了解的。而在JDK1.5中,原来的那个本地start方法被start0()代替,另一个纯JAVA的start()中调用本地方法start0(),而在start()方法中做了一个验证,就是对一个全局变量(对象变量)started做检验,如果为true,则start()抛出异常,不会调用本地方法start0(),否则,现将该变量设为true,然后调用start0()。

从中我们可以看到这个为了控制一个线程对象只能运行成功一次start()方法。这是因为线程的运行要获取当前环境,包括安全,父线程的权限,优先级等条件,如果一个线程可以运行多次,那么定义一个static的线程在一个环境中获取相应权限和优先级,运行完成后它在另一个环境中利用原来的权限和优先级等属性在当前环境中运行,这样就造成无法预知的结果。简单说,让一个线程对象只能成功运行一次,是基于对线程管理的需要。

start()方法最本质的功能是从CPU中申请另一个线程空间来执行run方法中的代码,它和当前线程是两条线,在相对独立的线程空间运行。也就是说,如果你直接调用线程对象的run方法,当然也会执行,但那是在当前线程中执行,run方法执行完成后继续执行下面的代码。而调用start()方法后,run方法的代码会和当前线程并发(单CPU)或并行(多CPU)执行。

所以请记住一句话:调用线程对象的run方法不会产生一个新的线程,虽然可以达到相同的执行结果,但执行过程和执行效率不同。

2. sleep,join,yield方法

先简单说一下这些方法的作用和调用原则。

时间: 2024-11-06 03:01:48

[转]java多线程例子的相关文章

Java多线程例子讲解

一:知识点声明: 1.区别进程和线程:进程是静态概念,它的执行依赖线程进行. 2.进程的状态:就绪(等待cpu执行),运行,中止,阻塞(等待所需资源,进入阻塞态) 3.Java程序的main函数即是一个线程,被称做主线程.此时如果新建线程,则和主线程一起并行运行. 4.Java中的构造方法.main函数谁先执行? main函数先执行,因为main是静态方法,程序一开始就执行:而构造方法只有在类实例化时才去调用. 二:实例程序 public class GetCurrentThread imple

java 多线程例子

java 多线程例子 编写具有多线程能力的程序经常会用到的方法有: run(), start(), wait(), notify(), notifyAll(), sleep(), yield(), join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run() 和start() 示例1: public class ThreadTest extends Thread {public void run() {for (int i = 0; i < 10; i

一个简单的java多线程例子

现在有这样一个任务,有一份手机号列表(20W),有一份话单的列表(10W),要统计哪些手机号没有出现在话单中,哪些手机号在话单中出现了不止一次. 想到的最直接的方式,就是两层循环去遍历,虽然此方法比较笨,但目前还没有想出更好的办法. 一开始使用单线程来处理,代码是随手写的并没有进行重构,只是做一个简单的说明: package tool; import java.util.List; public class SingleThread { public static void main(Strin

Java 多线程编程两个简单的例子

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

java 多线程——quartz 定时调度的例子

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 概述 第1部分 配置 第2部分 代码示例 第1部分 配置 有关quartz的api文档地址:Quartz Enterprise Job Scheduler 1.8.6 API 主要接口目录: 重点看下Job,Scheduler,Trigger,JobDetai

java 多线程——一个定时调度的例子

java 多线程目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 学习了一段时间的多线程内容,项目中有个定时调度的需求,将之前的需求重新梳理了下,写了一个多线程调用的例子,加深学习. 定时调度的需求如下:设定任务的开始时间,分为单次调度和循环调度,访问指定的url. java 多线程--一个定时调度的例子

“全栈2019”Java多线程第四十一章:读锁与写锁之间相互嵌套例子

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十一章:读锁与写锁之间相互嵌套例子 下一章 "全栈2019"Java多线程第四十二章:获取线程与读写锁的保持数 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&quo

Java多线程的常见例子

一.相关知识: Java多线程程序设计到的知识: (一)对同一个数量进行操作 (二)对同一个对象进行操作 (三)回调方法使用 (四)线程同步,死锁问题 (五)线程通信 等等 二.示例一:三个售票窗口同时出售20张票; 程序分析:1.票数要使用同一个静态值 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路:1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完! 2.创建

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及