多线程常见的3中实现方式

1.继承Thread类

源代码:

package com.zy.test.www.multiThread;
/**
 * 多线程实现方式1:继承Thread类
 * @author zy
 */
public class ByExtendsThread extends Thread{    

    public ByExtendsThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println(getName() + " 线程运行开始!");
        for (int i = 1; i <= 5; i++) {
            System.out.println(getName() + " " + i);
            try {
                sleep((int) Math.random() * 10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(getName() + " 线程运行结束!");
    }

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName() + " 线程运行开始!");
        new ByExtendsThread("A").start();
        new ByExtendsThread("B").start();
        System.out.println(Thread.currentThread().getName() + " 线程运行结束!");
    }

}

 运行效果:

main 线程运行开始!A 线程运行开始!main 线程运行结束!A 1B 线程运行开始!B 1A 2B 2A 3B 3A 4B 4A 5B 5A 线程运行结束!B 线程运行结束!

2.实现Runnable接口

源代码:

package com.zy.test.www.multiThread;

/**
 * 多线程实现方式2:实现Runnable接口
 * @author zy
 */
public class ByImplementsRunnable implements Runnable{    

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 线程运行开始!");
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
            try {
                Thread.sleep((int) Math.random() * 10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + " 线程运行结束!");
    }

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName() + " 线程运行开始!");
        ByImplementsRunnable byImplementsRunnable = new ByImplementsRunnable();
        new Thread(byImplementsRunnable, "A").start();
        new Thread(byImplementsRunnable, "B").start();
        System.out.println(Thread.currentThread().getName() + " 线程运行结束!");     }
}

 运行效果:

main 线程运行开始!
A 线程运行开始!
main 线程运行结束!
A 1
B 线程运行开始!
B 1
A 2
B 2
A 3
B 3
A 4
B 4
A 5
B 5
A 线程运行结束!
B 线程运行结束!
时间: 2024-10-12 13:54:46

多线程常见的3中实现方式的相关文章

IOS异步和多线程操作&amp;&amp;在sqlite3中的应用

1,数据库I/O操作(异步) 数据库本身是存储在磁盘上.访问和修改数据库,即对磁盘进行读写,即I/O操作. 磁盘属于计算机硬件,具有DMA能力,不需要CPU干预,可以实现异步操作. I/O操作一般是消耗时间,sqlite使用异步处理I/O操作. 当有多个事务对数据库进行操作,对应,也会有多个I/O操作. 操作系统将I/O操作,合理放入一个I/O队列.一次性将队列内的I/O操作提交给磁盘系统,并行处理多个I/O,提高效率.本人也没有特别深入研究. 2,异步和多线程 异步和多线程,都有能力实现,不阻

Objective-C中不同方式实现锁(二)-11-多线程

1 Objective-C中不同方式实现锁(二) 2 3 在上一文中,我们已经讨论过用Objective-C锁几种实现(跳转地址),也用代码实际的演示了如何通过构建一个互斥锁来实现多线程的资源共享及线程安全,今天我们继续讨论锁的一些高级用法. 4 5 1.NSRecursiveLock递归锁 6 7 平时我们在代码中使用锁的时候,最容易犯的一个错误就是造成死锁,而容易造成死锁的一种情形就是在递归或循环中,如下代码: 8 9 1 10 2 11 3 12 4 13 5 14 6 15 7 16 8

Objective-C中不同方式实现锁(一)-12-多线程

Objective-C中不同方式实现锁(一) 为什么需要使用锁,当然熟悉多线程的你,自然不会对它觉得陌生. 那你在代码中是否很好的使用了锁的机制呢?你又知道几种实现锁的方法呢? 今天一起来探讨一下Objective-C中几种不同方式实现的锁,在这之前我们先构建一个测试用的类,假想它是我们的一个共享资源,method1与method2是互斥的,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 @implementation TestObj - (void)method1 {

多线程06-多线程共享数据的方式(经验小结)

1.案例分析-01 通过代码实现火车票出售的例子 在实现代码之前先对问题进行分析:火车票出售应该是在多个窗口进行的(即多个线程),以一个车的班次来说,该班次的火车票张数即为多个窗口共享的数据 即这份共享数据为出售特定班次的火车票,这个动作在多个窗口都是不变的,变更的只有火车票的剩余张数.代码实现如下: package org.lkl.thead; /** * * Function : 多线程共享数据 * * @author : Liaokailin CreateDate : 2014-6-13

application/json 四种常见的 POST 提交数据方式

application/json 四种常见的 POST 提交数据方式 四种常见的 POST 提交数据方式 HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式. 我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行.请求头.消息主

网站常见的鉴权认证方式有哪几种?

一.什么是鉴权 鉴权(authentication)是指验证用户是否拥有访问系统的权利.传统的鉴权是通过密码来验证的.这种方式的前提是,每个获得密码的用户都已经被授权.在建立用户时,就为此用户分配一个密码,用户的密码可以由管理员指定,也可以由用户自行申请.这种方式的弱点十分明显:一旦密码被偷或用户遗失密码,情况就会十分麻烦,需要管理员对用户密码进行重新修改,而修改密码之前还要人工验证用户的合法身份. 为了克服这种鉴权方式的缺点,需要一个更加可靠的鉴权方式.目前的主流鉴权方式是利用认证授权来验证数

Redis常见的几种使用方式及其优缺点

本文主要针对Redis常见的几种使用方式及其优缺点展开分析. 一.常见使用方式 Redis的几种常见使用方式包括: Redis单副本: Redis多副本(主从): Redis Sentinel(哨兵): Redis Cluster: Redis自研. 二.各种使用方式的优缺点 1.Redis单副本 Redis单副本,采用单个Redis节点部署架构,没有备用节点实时同步数据,不提供数据持久化和备份策略,适用于数据可靠性要求不高的纯缓存业务场景. 优点: 架构简单,部署方便: 高性价比:缓存使用时无

Ext中border方式时 region注意点

在用region时有时候会出错,于是自己测试了下 代码: Ext.onReady(function(){ var viewport = new Ext.Viewport({ layout:'border', //html: '<p>第二步,一共4步</p>', items:[{ region: 'north', split: true, title:'north', //north, south, east, west or center) border: true },{ reg

java多线程之从任务中获取返回值

package wzh.test; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; class TaskWithResult implements Callable<Strin