首页 > 编程语言 >Java学习之路--thread--多线程相关

Java学习之路--thread--多线程相关

时间:2023-09-20 16:05:08浏览次数:54  
标签:Java String Thread -- start 线程 new 多线程 public

package com.thread;
/*
进程:一个进程里包含多个线程,程序运行起来就叫进程
线程:线程是程序中执行的线程
*/
public class Demo01 {
}

//
package com.thread;

//模拟龟兔赛跑
public class Race implements Runnable{

//胜利者
private static String winner;
private int steps;

@Override
public void run() {
for (int i = 0; i <= 100; i++) {

//模拟兔子睡觉
if (Thread.currentThread().getName().equals("兔子")){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag = gameOver();
//如果比赛结束了,就停止程序
if (flag){
break;
}
System.out.println(Thread.currentThread().getName() + "-->跑了" + i + "步");
}
}

//判断是否完成比赛
private boolean gameOver(){
//判断是否有胜利者
if (winner != null){//已经存在胜利者了
return true;
}{
if (steps == 100){
winner = Thread.currentThread().getName();
System.out.println("胜利者是" + winner);
return true;
}
}
return false;
}

public static void main(String[] args) {
Race race = new Race();

new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
race.gameOver();
}
}

//
package com.thread;

//创建线程的方式一:继承Thread类,重写run()方法,调用start开启线程
/*
步骤:
1,自定义线程类继承Thread类
2.重写run()方法,编写线程执行体
3.创建线程对象,调用start()方法启动线程
*/
//总结==注意,线程开启不一定立即执行,有CPU调度执行
public class TestThread extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码---" + i);
}
}

public static void main(String[] args) {
//main主线程,主线程

//创建一个线程对象
TestThread testThread = new TestThread();

//调用start()方法开启线程
testThread.start();

for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程--" + i);
}
}
}

//
//package com.thread;
//
//
//
//import sun.reflect.misc.FieldUtil;
//import org.apache.commons.io.FileUtils;
//
//import java.io.File;
//import java.io.IOException;
//import java.net.URL;
//
////练习Thread,实现多线程同步下载图片
//public class TestThread2 extends Thread{
// private String url; //网络图片地址
// private String name; //保存的文件名
//
// public TestThread2(String url, String name) {
// this.url = url;
// this.name = name;
// }
//
// //下载图片线程的执行体
// @Override
// public void run() {
// WebDownloader webDownloader = new WebDownloader();
// webDownloader.downloader(url,name);
// System.out.println("下载的文件名为:" + name);
// }
//
// public static void main(String[] args) {
// TestThread2 t1 = new TestThread2("https://ts1.cn.mm.bing.net/th/id/R-C.1287cf86af4c145c01e92cae3c4d13f7?rik=%2b2GZSYvwT96NCQ&riu=http%3a%2f%2fimg.ewebweb.com%2fuploads%2f20200103%2f07%2f1578006235-prqbKVnPMv.jpg&ehk=HBA7EvJHLk2XuZe9ZuKIvUPeiusTrc8gW0DSK7Vt1%2fg%3d&risl=&pid=ImgRaw&r=0","1.jpg");
// TestThread2 t2 = new TestThread2("https://ts1.cn.mm.bing.net/th/id/R-C.1287cf86af4c145c01e92cae3c4d13f7?rik=%2b2GZSYvwT96NCQ&riu=http%3a%2f%2fimg.ewebweb.com%2fuploads%2f20200103%2f07%2f1578006235-prqbKVnPMv.jpg&ehk=HBA7EvJHLk2XuZe9ZuKIvUPeiusTrc8gW0DSK7Vt1%2fg%3d&risl=&pid=ImgRaw&r=0","2.jpg");
// TestThread2 t3 = new TestThread2("https://ts1.cn.mm.bing.net/th/id/R-C.1287cf86af4c145c01e92cae3c4d13f7?rik=%2b2GZSYvwT96NCQ&riu=http%3a%2f%2fimg.ewebweb.com%2fuploads%2f20200103%2f07%2f1578006235-prqbKVnPMv.jpg&ehk=HBA7EvJHLk2XuZe9ZuKIvUPeiusTrc8gW0DSK7Vt1%2fg%3d&risl=&pid=ImgRaw&r=0","3.jpg");
//
// t1.start();
// t2.start();
// t3.start();
// }
//}
//
////下载器
//class WebDownloader {
// //下载方法
// public void downloader(String url, String name){
// try {
//// FileUtils.copyURLToFile(new URL(url),new File(name));
// FieldUtil.getField(new URL(url), new File(name));
// } catch (IOException e) {
// e.printStackTrace();
// System.out.println("IO异常,downloader方法出现问题");
// }
// }
//}

//
package com.thread;

//创建线程方式2:实现Runnable接口
//重写run方法,执行线程需要丢人runnable接口实现类,调用start方法
/*
步骤
1.定义MyRunnable类实现runnable接口,
2.实现run()方法,编写线程执行体
3.创建线程对象,调用start()方法启动线程
*/
public class TestThread3 implements Runnable{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 200; i++) {
System.out.println("我在看代码----" + i);
}
}

public static void main(String[] args) {
//创建runnable接口的实现类对象
TestThread3 testThread3 = new TestThread3();

// //创建线程对象,通过线程对象来开启我们的下线程,代理
// Thread thread = new TestThread();
//
// thread.start();
// testThread3.run();

new Thread(testThread3).start();

for (int i = 0; i < 1000; i++) {
System.out.println("我在学习多线程---" + i);
}
}
}
/*
小结:继承线程的两种方式
1.继承Thread类
(1)子类继承Thread类具备多线程能力
(2)启动线程:子类对象.start()
不建议使用:避免OOP单继承局限性

2.实现Runnable接口
(1)实现接口Runnable具有多线程能力
(2)启动线程:传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
*/

//
package com.thread;

//多个线程同时操作同一个对象
//买火车票的例子
//发现问题,多个线程操作哦同一个资源的情况下,线程不安全,数据紊乱
public class TestThread4 implements Runnable{

//票数
private int ticketNums = 10;
@Override
public void run() {
while (true) {
if (ticketNums <= 0){
break;
}
//模拟延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-->拿到了第" + ticketNums + "张票");
}
}

public static void main(String[] args) {

TestThread4 ticket = new TestThread4();

new Thread(ticket,"小明").start();
new Thread(ticket,"老师").start();
new Thread(ticket,"黄牛党").start();
}
}

标签:Java,String,Thread,--,start,线程,new,多线程,public
From: https://www.cnblogs.com/CaiDingChao/p/17717542.html

相关文章

  • git 网络问题-终极解决方案
    公司的网一直git有问题。明明挂了梯子,但还是经常出现timeout等等一系列问题。最终还是看了这篇设置代理解决github被墙-知乎(zhihu.com)博客解决的。但是注意的是,博客中提到的https和ssh都需要进行设置参考博客:设置代理解决github被墙-知乎(zhihu.com) ......
  • Redis 面试常见问答
    本文出自:https://thinkinjava.cn作者:莫那鲁道1.什么是缓存雪崩?怎么解决?一般而言,我们会利用缓存来缓冲对数据库的冲击,假如缓存无法正常工作,所有的请求便会直接发送至数据库,进而导致数据库崩溃,从而导致整个系统崩溃。如何解决呢?2种策略(同时使用):对缓存做高可用,防止缓......
  • CF1869C Fill in the Matrix
    Link首先想一下,如果又一列的\(MEX\)是\(n\)会有什么样的要求?需要这一样有\(0~n-1\)的所有数字并且没有\(n\)当我们知道这一点以后问题就很好解决了.我们应该构造数列的时候,满足第一行的\(MEX\)为\(0\),第\(i\)行的\(MEX\)为\(i-1\),这样就可以达到最大的答案。当\(......
  • 记一次跨服务器的文件下载功能开发
    1、背景:有这样一个需求,就是目前在OA系统的所有请求都会打到A服务器上,A服务器作为OA系统的门户服务,但是现在有个独立的文件备份服务,也想通过A服务器来让OA系统调用,里边包括了下载文件的功能,此时比如把文件备份服务部署到B服务器上,需要下载的文件也在B服务器上,文件备份服务提供了......
  • 封装Svg
    1、npmivite-plugin-svg-icons  npmifast-glob  2、在assets下创建svg目录  找想要的图标复制svg代码放到svg在vite.config.js配置:import{createSvgIconsPlugin}from'vite-plugin-svg-icons'//在plugins中添加 createSvgIconsPlugin({ iconDirs:[resol......
  • Windows下ffmpeg调用测试(YUV420P编码)
    1下载静态库和动态库如果你是动态加载,可以直接使用动态库(dlopen等);否则就才用动态+静态的方式(动态库的静态加载方式);或者直接将静态库编译到你的执行程序(纯静态组件使用);https://www.gyan.dev/ffmpeg/builds/#libraries 添加组件vs2022: 属性->c/c++->附加包含目录;将头文件......
  • 根据身份证号 判断男女、 获取出生日期、
    //通过截取身份证号码的最后两位,进行取余数来判断奇数偶数letsex= value.substring(16,17);//IDcard为用户输入的身份证号码returnsex%2==1?'男':'女'; //通过截取对应位置拼接对应的字符组成格式为yyyy-mm-ddletbirthday=value.substring(6,10)+"-"+......
  • hdfs副本数设置
    1.调整HDFS副本数##该命令只会设置当前已有的文件副本数,不会改默认副本数参数hadoopfs-setrep-R-w5/corelogs2.查看HDFS当前文件副本数hadoopfs-ls/corelogs##显示的第二个参数即为当前副本数......
  • Clone fail unable to access 'httpsgithub.comLovi-githubmyUserCenter.git' OpenSSL
    bug:unabletoaccess'https://github.com/xxx':OpenSSLSSL_read:SSL_ERROR_SYSCALL,errno10054关于git提交github出现errno10054、port443:Timedout等问题解决_git提交10054_husishuai的博客-CSDN博客按照上边的解决方法即可......
  • 火山引擎A/B测试在消费行业的案例实践
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群近日,火山引擎数智平台举办了“走进火山-全链路增长:数据飞轮转动消费新生力”的活动,其中火山引擎数智平台DataTester产品负责人分享了火山引擎AB测试(DataTester)在消费行业的应用实践,并发......