java学习--多线程(1)

文章目录[x]
  1. 1:java现线程的三种实现方式:

线程是编程中的一个重要特性,在Java中更是有着举足轻重的地位,大量应用于网络编程,服务器端程序的开发。小到自写的小代码,大到操作系统的底层原理处处都体现着多线程。

进程与线程的区别:


比如你开启了两个qq窗口就是启动了两个进程,而每一个QQ窗口的内部的同时实现就是线程。一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。不仅可以通过线程完成多任务,进程也是可以的。

并发与并行的区别;


并发就是实际只有一个CPU却在执行3个进程,但是并行就是比如物理内核数本身就是3个。

进程的状态-->其实这个在学习操作系统时就学到了:

特性:

  • 高可用
  • 高并发(JUC并发编程)
  • 高性能

概念:

  • 原来普通方法的调用,就是一条路径
  • 多线程的调用:开辟了多条路径

下面正式进入java的线程:

java现线程的三种实现方式:

第3种Callable在后面学线程池的时候用的多。

  • 第一种 继承Thread 重写run-->其实我们发现Thread也是继承Runnable接口的

示例:

/**
 *创建线程方式一
 * 继承Thread 重写run
 */
public class StartThread extends Thread{
    /**
     * 线程入口
     */
    @Override
    public void run() {
        for (int i=0;i<20;i++){
            System.out.println("正在听歌.......");

        }

    }

    public static void main(String[] args) {
        //创建子类对象
        StartThread st = new StartThread();
        //启动线程
        st.start();
        for (int i=0;i<20;i++){
            System.out.println("正在coding.......");

        }

    }
}

运行结果:

你会发现,至于先执行那个完全是由处理器调度的。

  • 第二种 继承Runnable 重写run  

示例:

/**
 *创建线程方式二
 * 继承Runnable 重写run
 */
public class StartRun implements Runnable{
    /**
     * 线程入口
     */
    @Override
    public void run() {
        for (int i=0;i<20;i++){
            System.out.println("正在听歌.......");
        }
    }

    public static void main(String[] args) {
       //创建实现类对象
        StartRun st = new StartRun();
        //创建代理类对象
        Thread t = new Thread(st);
        //启动线程
        t.start();

       new Thread(new StartRun()).start();
        for (int i=0;i<20;i++){
            System.out.println("正在coding.......");

        }
    }
}
  • 第三种 继承 Callable用到了泛型

这里用到了两个累,第一个是一个下载类,第二个调用第一个实现同时下载三张图片

第一个下载类:

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 下载图片
 */
public class WebDownloader {
    /**
     * 下载工具
     * @param url
     * @param name
     */
    public void download(String url,String name)  {
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        }catch (MalformedURLException e) {
            e.printStackTrace();
            System.out.println("不合法的url");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("图片下载失败");
        }


    }
}

第二个实现多线程下载图片的类:

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://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2403611520,809506871&fm=26&gp=0.jpg","lunpo.jpg");
CDownloader cd2 =new CDownloader("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1267931373,3662510004&fm=26&gp=0.jpg","shaonv.jpg");
CDownloader cd3 =new CDownloader("http://5b0988e595225.cdn.sohucs.com/images/20170830/d8b57e0dce0d4fa29bd5ef014be663d5.jpeg","success.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();
System.out.println(r3);
//关闭服务: 
ser.shutdownNow();

}
}

运行结果:

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00