Java线程代码的实现方法

一、线程Java代码实现

1.继承Thread

声明Thread的子类

public class MyThread extends Thread {
 public void run(){
  System.out.println("MyThread running");
 }
}

运行thread子类的方法

MyThread myThread = new MyThread();
myTread.start();

2.创建Thread的匿名子类

Thread thread = new Thread(){
 public void run(){
  System.out.println("Thread Running");
 }
};
thread.start();

3.实现Runnable接口

声明

public class MyThread implements Runnable {
@override
public void run() {
 System.out.println("MyThread is running");
}
}

运行

Thread thread = new Thread(new MyRunnable());
thread.start();

4.创建实现Runnable接口的匿名类

new Thread(new Runnable(){
 @override
 public void run() {
  System.out.println("Thread is running");
 }
}).start();

5.线程名字

创建时候可以给线程起名字

Thread thread = new Thread(new MyRunnable(),"name");?获得名字
Thread thread = new Thread(new MyRunnable(),"name");
System.out.println(thraed.getName());?获取运行当期代码线程的名字
Thread.currentThread().getName();

二、线程安全性

1.定义

线程会共享进程范围内的资源,同时,每个线程也会有各自的程序计数器,栈,以及局部变量。在多个线程不完全同步的情况下,多个线程执行的顺序是不可预测的,那么不同的执行顺序就可能带来极其糟糕的结果。

如何定义一个类是线程安全的呢?最核心的问题在于正确性,在代码中无需进行额外的同步或者协同操作的情况下,无论有多少个线程使用这个类,无论环境以何种方式调度多线程,这个类总能表现出正确的行为,我们就成这个类是线程安全的。

2.线程类不安全的实例

1.首先定义Count类,有私有成员count=0;

public class Count {
 private long count = 0;

 public long getCount() {
  return count;
 }

 public void service() {
  count++;
 }
}

2.然后在线程中去调用这个类的service方法

final Count count = new Count();
for (int i = 0; i < 20000; i++) {
 Thread thread3 = new Thread(){
  @Override
  public void run() {
   count.service();
   if (count.getCount() == 20000) {
    System.out.println("ahha");
   }
  }
 };
 thread3.start();
}

3.结果程序却没有输出,说明最后count并没有达到20000,为什么呢?

因为存在着以下错误执行的情况:线程2在线程1没有完成count自增的情况下就读取了count,导致最后count没有达到20000。

4.并发编程中,这种由于不恰当的执行顺序而显示了不正确结果的情况叫做Race Condition(竞争状态),这种情况出现的根本原因是count的自增没有保持原子性。count自增分三步操作,而不是一步到位。

以上这篇Java线程代码的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解三种java实现多线程的方式

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread { public void run() { for (int i = 0; i < 10000; i++) { System.out.println("我是线程"+this.getId()); } } public static void main(String[] args) {

  • 详解Java实现多线程的三种方式

    本文实例为大家分享了Java实现多线程的三种方式,供大家参考,具体内容如下 import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class Main { public static void main(String[] args) { //方法一:继承Thread int i = 0; // for(; i < 100; i++){ // System.out.println(T

  • Java多线程的实现方式比较(两种方式比较)

    先看一下java线程运行时各个阶段的运行状态 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行.由于线程之间的相互制约,致使线程在运行中呈现出间断性. 在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位.由于线程比进程更小,基本上不拥有系统资源,故对它的

  • Java创建多线程的两种方式对比

    采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread()方法. 劣势:因为这种线程类已经继承了Thead类,所以不能再继承其它类. 示例代码: 复制代码 代码如下: package org.frzh.thread;    public class FirstThread extends Thread{      private int i;           //重写run方法,run方法的方法体就是线程执

  • Java线程代码的实现方法

    一.线程Java代码实现 1.继承Thread 声明Thread的子类 public class MyThread extends Thread { public void run(){ System.out.println("MyThread running"); } } 运行thread子类的方法 MyThread myThread = new MyThread(); myTread.start(); 2.创建Thread的匿名子类 Thread thread = new Thre

  • Java线程操作的常见方法【线程名称获取、设置、线程启动判断等】

    本文实例讲述了Java线程操作的常见方法.分享给大家供大家参考,具体如下: 一 线程名称的操作 1 代码 public class GetNameThreadDemo extends Thread { public void run() { for( int i = 0; i < 5; ++i ) { printMsg(); try { Thread.sleep(1000); // 睡眠1秒 } catch( InterruptedException e ) { e.printStackTrac

  • Java线程三种命名方法详解

    这篇文章主要介绍了Java线程三种命名方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.实例化一个线程对象 Thread t = new Thread(); t.setName("甲"); 2.实例化一个线程对象的同时,通过构造方法对线程进行命名 Thread(Runnable r, String name) Thread t = new Thread(() -> {}, "甲"); 3.使用自定义

  • 如何理解Java线程池及其使用方法

    目录 一.前言 二.总体的架构 三.研读ThreadPoolExecutor 3.1.任务缓存队列 3.2.拒绝策略 3.3.线程池的任务处理策略 3.4.线程池的关闭 3.5.源码分析 四.常见的四种线程池 4.1.newFixedThreadPool 4.2.newSingleThreadExecutor 4.3.newCachedThreadPool 4.4.newScheduledThreadPool 五.使用实例 5.1.newFixedThreadPool实例 5.2.newCach

  • Java线程中的常见方法(start方法和run方法)

    目录 start方法和run方法 示例代码 注意 sleep方法与yield方法 sleep yield 线程优先级 sleep的应用-防止cpu占用100% join方法 有实效的等待 interrupt方法 打断正常运行的线程,不会清空打断状态 守护线程 start方法和run方法 $start()$方法用来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到$cpu$时间片,就开始执行$run()$方法.而直接调用$run()$方法,仅仅只是调用了一个类里的方法,其本质上还

  • Java计算程序代码执行时间的方法小结

    本文实例总结了Java计算程序代码执行时间的方法.分享给大家供大家参考,具体如下: 有时候为了排查性能问题,需要记录完成某个操作需要的时间,我们可以使用System类的currentTimeMillis()方法来返回当前的毫秒数,并保存到一个变量中,在方法执行完毕后再次调用 System的currentTimeMillis()方法,并计算两次调用之间的差值,就是方法执行所消耗的毫秒数. 如方法一: long startTime = System.currentTimeMillis(); //获取

  • Java线程间共享实现方法详解

    一.synchronize对象锁和类锁 synchronize为多线程关键字是一种同步锁,它可以修饰以下几种对象: 代码块:被修饰的代码块被称为同步代码块,作用的范围是{}里面的代码,作用的对象是调用这个代码块的对象 方法:被修饰的方法称为同步方法,作用的范围是整个方法,作用的对象是调用这个方法的对象 类:作用的范围是synchronize后面括号里的部分,作用的对象是当前这个类 1.对象锁 下面由一个栗子引入: public class TestSynchronize { //加了对象锁的方法

  • java 线程池的实现方法

    线程池有以下几种实现方式: Executors目前提供了5种不同的线程池创建配置: 1.newCachedThreadPool() 它是用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程:如果线程闲置时间超过60秒,则被终止并移除缓存:长时间闲置时,这种线程池,不会消耗什么资源.其内部使用SynchronousQueue作为工作队列. 2.newFixedThreadPool(int nThreads) 重用指定数目(nThre

  • java 线程中start方法与run方法的区别详细介绍

    线程中start方法与run方法的区别 在线程中,如果start方法依次调用run方法,为什么我们会选择去调用start方法?或者在java线程中调用start方法与run方法的区别在哪里?  这两个问题是两个非常流行的初学者级别的多线程面试问题.当一个Java程序员开始学习线程的时候,他们首先会学着去继承Thread类,重载run方法或者实现Runnable接口,实现run方法,然后调用Thread实例的start方法.但是当他拥有一些经验之后,他通过查看API文档或者其他途径会发现start

  • Java线程的start方法回调run方法的操作技巧

    面试中可能会被问到为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法? Java 创建线程的方法 实际上,创建线程最重要的是提供线程函数(回调函数),该函数作为新创建线程的入口函数,实现自己想要的功能.Java 提供了两种方法来创建一个线程: 继承 Thread 类 class MyThread extends Thread{ public void run() { System.out.println("My thread is started.&qu

随机推荐