java多线性--线程创建

什么是多线程:不同的功能同时进行

Process(进程)与Thread(线程)

  • 进程是执行程序的一次执行过程,是一个动态的概念。是系统分配资源的单位。
  • 一个进程分为多个线程,一个进程中至少包含一个线程。线程是CPU调度和执行的单位。

线程创建

创建线程的三种方式:

  • Thread:继承 Thread类
  • Runnable:实现Runnable接口
  • Callable:实现Callable接口 (了解)

Thread

  1. 自定义线程类继承Thread类。

  2. 重写其中的run()方法,编写线程执行体。

  3. 创建线程对象,调用start()方法启动线程。

package com.ssl.demo01;

//创建线程方式1:继承Thread类,重写run方法,调用start()方法
//总结:线程开启不一定立即执行,由CPU调度执行。 public class TestThread1 extends Thread{ //重写run方法
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码--"+i);
}
} public static void main(String[] args) {
//创建线程对象,调用start方法
TestThread1 testThread1 = new TestThread1();
testThread1.start(); //交替执行
//testThread1.run(); 先执行完,再走主线程。 //main线程 主线程
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程---"+i);
}
} }

练习下载图片

apache下载:

http://commons.apache.org/proper/commons-io/

package com.ssl.demo01;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.lang.String; //练习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 test1 = new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwx3.sinaimg.cn%2Fmw690%2F006a7Fqsly1h6l1m1o2v8j31o02yo7wi.jpg&refer=http%3A%2F%2Fwx3.sinaimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667102238&t=2663277ec5f007ad772e6cface75ec86","1.png");
TestThread2 test2 = new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbkimg.cdn.bcebos.com%2Fpic%2F37d12f2eb9389b504fc209f70a7af2dde71190efc04c&refer=http%3A%2F%2Fbkimg.cdn.bcebos.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667102500&t=ce4bf55425348082daa6f6e5132a8920","2.png");
TestThread2 test3 = new TestThread2("https://img1.baidu.com/it/u=4282593950,4216695015&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=515","3.png");
TestThread2 test4 = new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F11324654676%2F1000.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667102566&t=e9f6e5a7c126a283489789301cacb584","4.png"); test1.start();
test2.start();
test3.start();
test4.start();
}
} //下载器
class WebDownloader{
//下载方法
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloader方法出问题");
}
}
}

Runnable

步骤:

  1. 定义MyRunable类实现Runable接口
  2. 实现run()方法
  3. 创建线程对象,调用start()方法启动线程
package com.ssl.demo01;

//创建线程方法2:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法。
public class TestThread3 implements Runnable{ @Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码--"+i);
}
} public static void main(String[] args) {
//创建线程对象
TestThread3 testThread3 = new TestThread3();
//创建一个Thread; 把实现对象丢进去。
Thread thread = new Thread(testThread3);
thread.start(); //main线程 主线程
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程--"+i);
}
}
}

练习:

package com.ssl.demo01;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL; public class TestThread4 implements Runnable{ private String url;
private String name; //构造器
public TestThread4(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) {
TestThread4 test1 = new TestThread4("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwx3.sinaimg.cn%2Fmw690%2F006a7Fqsly1h6l1m1o2v8j31o02yo7wi.jpg&refer=http%3A%2F%2Fwx3.sinaimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667102238&t=2663277ec5f007ad772e6cface75ec86","1.png");
TestThread4 test2 = new TestThread4("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbkimg.cdn.bcebos.com%2Fpic%2F37d12f2eb9389b504fc209f70a7af2dde71190efc04c&refer=http%3A%2F%2Fbkimg.cdn.bcebos.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667102500&t=ce4bf55425348082daa6f6e5132a8920","2.png");
TestThread4 test3 = new TestThread4("https://img1.baidu.com/it/u=4282593950,4216695015&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=515","3.png");
TestThread4 test4 = new TestThread4("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F11324654676%2F1000.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667102566&t=e9f6e5a7c126a283489789301cacb584","4.png"); Thread t1 = new Thread(test1);
Thread t2 = new Thread(test2);
Thread t3 = new Thread(test3);
Thread t4 = new Thread(test4); t1.start();
t2.start();
t3.start();
t4.start();
}
} //下载器
class WebDownloader{
//下载方法
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloader方法出问题");
}
}
}

推荐使用Runnable实现方式。

多线程同时操作一个方法

并发问题: 多个线程操作一个对象时,会产生并发问题。

package com.ssl.demo01;

//多线程同时操作一个对象
//买火车票的例子
public class TestThread5 implements Runnable{ //票数
private int ticketNums = 10; @Override
public void run() {
while (true) {
if(ticketNums==0)
break;
//模拟延时,会存在并发问题
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//得到当前线程的名字
System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"票");
}
} public static void main(String[] args) {
TestThread5 tickle = new TestThread5(); Thread thread1 = new Thread(tickle,"小明");
Thread thread2 = new Thread(tickle,"大黄");
Thread thread3 = new Thread(tickle,"老师");
Thread thread4 = new Thread(tickle,"黄牛党"); thread1.start();
thread2.start();
thread3.start();
thread4.start(); } }

龟兔赛跑

package com.ssl.demo01;

public class Race implements Runnable{

    //胜利者
private static String winner; @Override
public void run() {
for (int i = 0; i < 100; i++) {
//判断比赛是否结束
boolean flag = gameOver(i);
if(flag){
break;
}
//模拟兔子睡觉
if(Thread.currentThread().getName()=="兔子" && (i+1)%50==0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");
}
} //判断是否完成比赛
private boolean gameOver(int steps){
if(winner!=null){
return true;
}else{
if (steps >= 99){
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(); }
}

Callable

步骤:(了解即可)

  1. 实现Callable接口,需要返回值类型
  2. 重写call方法,需要抛出异常
  3. 创建目标对象
  4. 创建执行服务:
ExecutoService ser = Exectors.newFixedThreadPool(数量);
  1. 提交执行:
Future<Boolean> result1 = ser.submit(t1);
  1. 获取结果
boolean r1 = result1.get();
  1. 关闭服务
ser.shutdownNow();

实现下载图片

package com.ssl.demo01;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*; //线程创建方法3 实现callable接口
/**
*
*/ public class TestCallable implements Callable<Boolean> { private String url;
private String name; @Override
public Boolean call(){
WebDownloader2 webDownloader = new WebDownloader2();
webDownloader.downloader(url,name);
System.out.println("下载了文件名为:"+name);
return true;
} //构造器
public TestCallable(String url, String name){
this.url = url;
this.name = name;
} public static void main(String[] args) {
TestCallable test1 = new TestCallable("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwx3.sinaimg.cn%2Fmw690%2F006a7Fqsly1h6l1m1o2v8j31o02yo7wi.jpg&refer=http%3A%2F%2Fwx3.sinaimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667102238&t=2663277ec5f007ad772e6cface75ec86","1.png");
TestCallable test2 = new TestCallable("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbkimg.cdn.bcebos.com%2Fpic%2F37d12f2eb9389b504fc209f70a7af2dde71190efc04c&refer=http%3A%2F%2Fbkimg.cdn.bcebos.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667102500&t=ce4bf55425348082daa6f6e5132a8920","2.png");
TestCallable test3 = new TestCallable("https://img1.baidu.com/it/u=4282593950,4216695015&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=515","3.png");
TestCallable test4 = new TestCallable("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F11324654676%2F1000.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667102566&t=e9f6e5a7c126a283489789301cacb584","4.png"); //创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(4); //提交执行
Future<Boolean> result1 = ser.submit(test1);
Future<Boolean> result2 = ser.submit(test2);
Future<Boolean> result3 = ser.submit(test3);
Future<Boolean> result4 = ser.submit(test4); //获取结果
try {
boolean rs1 = result1.get();
boolean rs2 = result2.get();
boolean rs3 = result3.get();
boolean rs4 = result4.get();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
} //关闭服务
ser.shutdownNow();
}
} //下载器
class WebDownloader2{
//下载方法
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloader方法出问题");
}
}
}

java多线性--线程创建的更多相关文章

  1. Java并发1——线程创建、启动、生命周期与线程控制

    内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...

  2. Java多线程系列-线程创建

    1.怎样创建多线程? Java从语言级别实现多线程,因此实现一个多线程程序很easy.有两种方法能够实现多线程,即继承Thread类和实现Runnable接口.由于Java不支持多继承的原因,建议尽可 ...

  3. java中的线程创建和使用

    Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口.Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合 ...

  4. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  5. Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...

  6. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  7. java多线程编程(二创建线程)

    1.概念           因为java是完全面向对象的,所以在java中,我们说的线程,就是Thread类的一个实例对象.所以,一个线程就是一个对象,它有自己字段和方法. 2.创建线程 创建线程有 ...

  8. Java并发编程:线程和进程的创建(转)

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  9. Java线程创建形式 Thread构造详解 多线程中篇(五)

    Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...

  10. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

随机推荐

  1. adaptsegnet 论文分析比较好的

    https://blog.csdn.net/weixin_43795588/article/details/118058775 常用的语义分割一般是由两部分组成:一部分是特征提取器,比如可以用Resn ...

  2. python脚本通过adb命令安装包

    import os os.system("adb install E:\\huaxin.apk") os.system("adb install E:\\hx_recor ...

  3. Windows+svn +Jenkins+发布NetCore/VUE项目

    1. NetCore环境下载,注意是下载SDK,不是Runtime:https://dotnet.microsoft.com/download/dotnet-core?utm_source=getdo ...

  4. springboot项目打成jar包,启动指定外部的yml文件

    java -jar xxx.jar --spring.config.local=application.yml

  5. 【摘】python和它的装饰器

    python和它的装饰器 即使你没听过装饰器,你也一定知道@staticmethod 作为函数的装饰器,你可以这样写 def mydecorator(function): def wrapped(*a ...

  6. select * into,insert into,create table

    SELECT * INTO Table2 FROM Table1要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中 INSERT I ...

  7. python扑克牌

    import random import operator def auto(): pokers=[] poker=[] for i in ['','','','']: for j in ['A',' ...

  8. if (()) [[]] [] 条件表达式比较示例

    a.b的ASCII码是 097.098ASCII码 参考 http://www.51hei.com/mcu/4342.html 1. if (()) a=3; b=2 时,if (( a > b ...

  9. List,Set,Map存取元素各有什么特点 hashMap、hashTable的区别 Arraylist和linkedList的区别

    1.List,Set,Map存取元素各有什么特点? 1.存放 (1)List存放元素是有序,可重复 (2)Set存放元素无序,不可重复 (3)Map元素键值对形式存放,键无序不可重复,值可重复 2.取 ...

  10. element ui动态生成表单数据与校验(后台传入数据)

    前言 最近有一个需求是通过后台返回的数据,生成表单并添加校验.在做的过程中,动态表单挺好做,关键是校验.困扰了我2天,最后通过查找资料和"运气"终于解决了.解决问题关键点:vue的 ...