一个类两个接口

Tread类: 使用时继承Thread类

Runnable接口: 使用时实现Runnable接口

Callable接口: 使用时实现Callable接口

由于类只能单继承, 接口可以多继承, 所以尽量使用接口

Thread的继承(创建线程方式一)

/*
* 创建线程方式一:
* 1, 创建: 继承Tread类 + 重写run
* 2, 启动: 创建子类对象 + start
*
*/ public class StartThread extends Thread{ @Override
public void run() {
for(int i = 0; i < 20; i++) {
System.out.println("music");
}
} public static void main(String[] args) {
// 创建子类对象
StartThread st = new StartThread(); // 启动
st.start(); // 不保证立即运行cpu调用 for(int i = 0; i < 20; i++) {
System.out.println("coding");
}
}
}

Runnable的实现(创建线程方式二)

  1. 创建目标对象
  2. 创建线程对象 + 关联目标对象
  3. 启动线程
/*
* 创建线程方式二:
* 1, 创建: 实现Runnable + 重写run
* 2, 启动: 创建实现类对象 + Thread对象 + start
*
* 推荐: 避免单继承的局限性, 优先使用接口
* 方便共享资源
*/
public class StartRun implements Runnable{ @Override
public void run() {
for(int i = 0; i < 20; i++) {
System.out.println("music");
}
} public static void main(String[] args) {
/* 方法一: 声明引用
// 创建实现类对象
StartRun sr = new StartRun();
// 创建代理类对象
Thread t = new Thread(sr);
// 启动
t.start(); // 不保证立即运行cpu调用
*/ // 方法二: 匿名(一个对象只使用一次)
new Thread(new StartRun()).start();
for(int i = 0; i < 20; i++) {
System.out.println("coding");
}
}
}
/**********模拟龟兔赛跑示例程序************/
public class Racer implements Runnable {
private static String winner; // 共享资源
@Override
public void run() {
for(int steps = 1; steps <= 100; steps++) {
// 模拟乌龟休息
if(Thread.currentThread().getName().equals("rabbit") && steps%10 == 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "---->" + steps);
if(gameOver(steps)) {
break;
}
}
} private boolean gameOver(int steps) {
if(null != winner ) { // 分出胜负后, 通过共享变量结束另一个线程
return true;
} else {
if(steps == 100) {
winner = Thread.currentThread().getName();
System.out.println("winner---->" + winner);
return true;
}
}
return false;
} public static void main(String[] args) {
Racer racer = new Racer();
new Thread(racer, "tortoise").start();
new Thread(racer, "rabbit").start();
} }
package cn.zyb.thread;
/**
* 共享资源, 并发
*
* @author Administrator
*
*/ public class Web12306 implements Runnable{
// 票数
private int ticketNumbers = 5; @Override
public void run() {
while(true) {
if(ticketNumbers < 0) {
break;
}
// 加入睡眠后线程不安全
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
System.out.println(Thread.currentThread().getName()
+ "---->" + ticketNumbers--);
}
} public static void main(String[] args) {
// 一份资源
Web12306 web = new Web12306(); // 多个代理
new Thread(web, "zyb").start();
new Thread(web, "zpy").start();
new Thread(web, "haha").start();
}
}
/*
zpy---->4
haha---->1
zyb---->2
zpy---->0
*/

Callable的实现(创建线程方式三)

  1. 创建目标对象
  2. 创建执行服务
  3. 提交执行
  4. 获取结果
  5. 关闭服务
/****************文件一******************/
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class CDownloader implements Callable<Boolean> {
private String url;
private String name; public CDownloader(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public Boolean call() throws Exception{
WebDownloader wd = new WebDownloader();
wd.download(url, name);
System.out.println(name);
return true;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
CDownloader cd1 = new CDownloader("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1538910423159&di=9cad47c1aab60ebb7ab6ff71cfe20646&imgtype=0&src=http%3A%2F%2Fa.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F377adab44aed2e73c3dc082b8a01a18b87d6fa84.jpg",
"1.jpg");
CDownloader cd2 = new CDownloader("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1538910447240&di=c821bb352f682af7ce07e335f05295c5&imgtype=0&src=http%3A%2F%2Fd.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F203fb80e7bec54e77d03071cb4389b504ec26ac0.jpg",
"2.jpg");
CDownloader cd3 = new CDownloader("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1538910459543&di=f99f4f6848913e2edc015cc39bf15f79&imgtype=0&src=http%3A%2F%2Fd.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2Fb64543a98226cffc254c32acb4014a90f603ea4e.jpg",
"3.jpg");
// 创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
// 提交执行
Future<Boolean> result1 = ser.submit(cd1);
Future<Boolean> result2 = ser.submit(cd2);
Future<Boolean> result3 = ser.submit(cd3);
// 获取结果
boolean r1 = result1.get();
boolean r2 = result1.get();
boolean r3 = result1.get();
// 关闭服务
ser.shutdownNow();
}
} /****************文件二******************/ import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL; // 自定义包
import org.apache.commons.io.FileUtils; /**
* 下载
* @author Administrator
*
*/
public class WebDownloader {
public void download(String url, String name) {
try {
FileUtils.copyURLToFile(new URL(url), new File (name));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("不合法URL");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("下载失败");
}
} }

Java_多线程实现的更多相关文章

  1. JAVA_多线程_单例模式

    这篇是入职之后的第二篇了,上一篇我简单介绍了一下LOCK里面的类的方法,感兴趣的话可以去了解一下,以后坚持每周至少会更新一篇关于多线程方面的文章,希望博友们可以一起加油成长. 这篇主要的内容是单例模式 ...

  2. java_多线程4种实现方式

    为了34月份回学校春招,不得不复习一下线程的四种实现方式,希望春招时能找到更好的公司,加油! 1.继承Thread类 class MyThread extends Thread{ private in ...

  3. 【Java_多线程并发编程】JUC原子类——原子类中的volatile变量和CAS函数

    JUC中的原子类是依靠volatile变量和Unsafe类中的CAS函数实现的. 1. volatile变量的特性 内存可见性(当一个线程修改volatile变量的值后,另一个线程就可以实时看到此变量 ...

  4. 【Java_多线程并发编程】基础篇——synchronized关键字

    1. synchronized同步锁的原理 当我们调用某对象的synchronized方法或代码块时,就获取了该对象的同步锁.例如,synchronized(obj)就获取了“obj这个对象”的同步锁 ...

  5. 【Java_多线程并发编程】基础篇—线程状态及实现多线程的两种方式

    1.Java多线程的概念 同一时间段内,位于同一处理器上多个已开启但未执行完毕的线程叫做多线程.他们通过轮寻获得CPU处理时间,从而在宏观上构成一种同时在执行的假象,实质上在任意时刻只有一个线程获得C ...

  6. Java_多线程2_线程池

    线程池(pool): 线程池的作用: 1.节省资源,减少线程的数量和创建销毁线程的开销2.合理的管理线程的分配 线程池的创建: 1.newCachedThreadPool //优点:很灵活,弹性的线程 ...

  7. Java_多线程

    线程(Thread) 1.线程是CPU进行资源调度的最小单位 2.线程是进程实际运行的单位,处理进程中无数的小任务 3.线程共享代码和数据空间 4.一个进程可以并发多个线程,线程之间切换系统开销很小 ...

  8. 【Java_多线程并发编程】JUC原子类——AtomicLong原子类

    1. AtomicLong是基本原子类中的一种 AtomicLong是对长整形进行原子操作. 1.1 AtomicLong类的函数列表 // 构造函数 AtomicLong() // 创建值为init ...

  9. 【Java_多线程并发编程】JUC原子类——4种原子类

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: Atom ...

  10. 【Java_多线程并发编程】基础篇——线程状态扭转函数

    1. wait() sleep() yield() join()用法与区别 本文提到的当前线程是指:当前时刻,获得CPU资源正在执行的线程. 1.1 wait()方法 wait()方法定义在Objec ...

随机推荐

  1. 【代码审计】JAVA代码审计

    分享一些Java安全相关文章,其中大部分都涉及到代码的分析与审计. 大家总是在找Java的代码审计的文章,但好像很多人选择性失明. 其实Java没有和PHP一样的简单,所以你觉得你看到的文章不是入门级 ...

  2. Matlab中加汉明窗 ahmming 作用

    转自:http://www.cnblogs.com/lxy2017/p/4049124.html 1.什么是汉明窗? 语音信号一般在10ms到30ms之间,我们可以把它看成是平稳的.为了处理语音信号, ...

  3. matlab中uicontrol创建用户界面控件

    来源:https://ww2.mathworks.cn/help/matlab/ref/uicontrol.html?searchHighlight=uicontrol&s_tid=doc_s ...

  4. 【题解】X龙珠

    明天好像要考链表今晚笔者来了解下. 题目链接 解: 对于这道题,由于前面要与后面重新连起来,于是我们考虑链表. 我们先正常用链表维护关系.然后,我们从大到小枚举. 对于这个数,如果它后面有数(因为是一 ...

  5. CentOS之—双网卡双IP双网关配置

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/77487639 一.配置讲解 1.配置DNS 修改对应网卡的DNS的配置文件 # v ...

  6. ASP。NET Core Blazor CRUD使用实体框架和Web API

    下载source code - 1.7 MB 介绍 *请查看我的Youtube视频链接来学习ASP.NET Core Blazor CRUD使用实体框架和Web API. 在本文中,我们将了解如何为A ...

  7. FreeType2使用总结(转)

    一.FreeType2简介 1. 是一个免费.开源.可移植且高质量的字体引擎: 2. 支持多种字体格式文件,并提供了统一的访问接口: 3. 支持单色位图.反走样位图渲染,这使字体显示质量达到Mac的水 ...

  8. day04 Pyhton学习

    一.上节课内容回顾 字符串 由','','''',""'"括起来的内容是字符串 字符:单一文字符号 字符串:把字符连成串(有顺序的) 索引和切片 s[start: end ...

  9. spring框架中配置mysql8.0需要注意的地方(转载)

    8.0以后的mysql很强大,但是配置写法出现了不同 主要原因是时区不同,mysql默认用的是国外某个地方的时区,而我们要用的话用使用东八时区,这是中国统一时区. 装载自https://blog.cs ...

  10. CentOS 7操作系统基础优化介绍

    01 前言 操作系统部署完毕后,需要做一些基础的简单优化操作,可以为系统未来的使用过程带来更多便捷. 02 操作系统安全优化配置 系统安装完毕后,默认系统中会存在两个重要的安全服务程序,建议将其首先进 ...