ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java多线程学习

2022-05-21 14:35:21  阅读:97  来源: 互联网

标签:java String Thread 学习 start 线程 new 多线程 public


创建线程的第一种方式

继承多线程

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

public class TestThread1 extends Thread{
    
}

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

 public void run() 
{
        //run方法线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("我在看代码--" + i);
        }
    }

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

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

        //创建一个线程对象
        TestThread1 testThread1 = new TestThread1();

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

练习:网图下载

1.将commons-io-2.11.0.jar放在项目lib目录下

2.将将commons-io-2.11.0.jar加入到Libraries中

1.点击Project Structure

2.按照图片依次选择,最后点击apply

3.编写代码

package MultiThread;

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 testThread1 = new TestThread2("https://t7.baidu.com/it/u=737555197,308540855&fm=193&f=GIF","1.png");
        TestThread2 testThread2 = new TestThread2("https://t7.baidu.com/it/u=1819248061,230866778&fm=193&f=GIF","2.png");
        TestThread2 testThread3 = new TestThread2("https://t7.baidu.com/it/u=963301259,1982396977&fm=193&f=GIF","3.png");

        //先下载testThread1
        testThread1.start();
        //然后是testThread2
        testThread2.start();
        //最后是testThread3
        testThread3.start();

    }
}

//下载器
class WebDownloader{

    //下载方法
    public static 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方法出现问题");
        }
    }
}

线程同步执行没有按照所给的代码顺序执行

创建线程第二种方式

1.定义MyRunnable实现Runnable接口

public class TestThread3 implements Runnable{

}

2.实现run()方法,编写线程执行体

@Override
public void run() {
    //run方法线程体
    for (int i = 0; i < 200; i++) {
        System.out.println("我在看代码--" + i);
    }
}

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

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

    //创建runnable接口的实现类对象
    TestThread3 testThread3 = new TestThread3();

    //创建线程对象,通过线程对象来开启线程,代理

    new Thread(testThread3).start();

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

小结

继承Thread类

1.子类继承Thread类具备多线程的能力

2.启动线程:子类对象.start()

3.不建议使用:避免OOP单继承局限性

实现Runnable接口

1.实现接口Runnable具备多线程能力

2.启动线程:传入目标对象+Thread对象.start()

new Thread(testThread3).start();

3.推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

package MultiThread;

import sun.security.krb5.internal.Ticket;

//多个线程同时操作同一个对象
//买火车票的例子

//发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱。
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
来源: https://www.cnblogs.com/lololopopo/p/16295000.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有