多线程的使用三个窗口同时卖票+线程下载

1. 两个线程轮流打印数字,一直到100

package XianChengZuoye;

public class ZuoYe1 extends Thread{
static int num=0;
static Object obj=new Object();

@Override
public void run() {
     while (true){
        try {
            Thread.sleep(2000);
            synchronized (obj) {
                if (num >= 0) {
                    System.out.println("打印数字:" +Thread.currentThread()+ num);
                    num++;
                }else {
                    System.out.println("0-100的数字已打印完");
                    System.exit(0);
                }
            }
                        } catch (InterruptedException e) {
                     e.printStackTrace();
        }
     }
}
public static void main(String[] args) {
    ZuoYe1 z1 = new ZuoYe1();
    z1.start();
    ZuoYe1 z2 = new ZuoYe1();
    z2.start();
}
}

2. 三个窗口同时卖票 用 实现Runnable方式

package Xianchengti;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class HuoChePiao extends Thread {
static int count=20;
static Object obj=new Object();

@Override
public void run() {

    while (true){

        try {
            Thread.sleep(2000);
 synchronized (obj){
     if (count>0){
         System.out.println("当前被卖出的是:"+Thread.currentThread()+count+"号票");
         count--;
     }else {
         System.out.println("当前票已卖完");
         System.exit(0);
     }
 }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}



public static void main(String[] args) {



    HuoChePiao hc = new HuoChePiao();

    hc.start();
    HuoChePiao hc1 = new HuoChePiao();
    hc1.start();
    HuoChePiao hc2 = new HuoChePiao();
    hc2.start();
}
}

3. 多线程下载 ,实现断点续传

package XiaZaiXianCheng;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class XiaZai extends Thread {

private int startIndex; //线程开始下载的位置
private  int endIndex;  //线程结束下载的位置
private  int threadId; //线程编号

public XiaZai(int startIndex, int endIndex, int threadId) {
    this.startIndex = startIndex;
    this.endIndex = endIndex;
    this.threadId = threadId;
}


@Override
public void run() {

    try {
        URL url = new URL(XiaZaiTest.path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setRequestMethod("GET");//get请求
        conn.setConnectTimeout(5000); //链接超时
        conn.setReadTimeout(5000);//读取超时
        conn.setRequestProperty("Range","bytes="+startIndex+"-"+endIndex);// 设置返回请求参数  获取线程下载范围

        if(conn.getResponseCode()==206){
            InputStream is = conn.getInputStream();//存储的是服务器上面  百度客户端数据
            //提供一个接收地方(本地接收)
            File file = new File("BaiduNetdisk_6.9.7.4.exe");
            //输出流  ,开始写数据  ,随机读写 流
            RandomAccessFile raf = new RandomAccessFile(file,"rwd");
            raf.seek(startIndex);  //跳转到 每个线程 开始读取的位置
            System.out.println("线程:"+threadId+" 开始的位置:"+startIndex+"---"+" 结束位置"+endIndex);
            int len=0;
            byte[] bt = new byte[1024];
            while ((len=is.read(bt))!=-1){
            raf.write(bt,0,len);

            }
            System.out.println("线程:"+threadId+"下载完毕...");
            raf.close();
            raf.close();
            XiaZaiTest.finishedThread++;
            //如果所有线程都下载完毕 ,让finishedThread 为0
            synchronized (XiaZaiTest.path){
                XiaZaiTest.finishedThread=0;
            }


        }


    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

测试类:

package XiaZaiXianCheng;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class XiaZaiTest {

//这是一个下载的安装包地址 1.5MB大小

 static  String path="http://softforspeed.51xiazai.cn/down/BaiduNetdisk_6.9.7.4.exe";
static int threadCount = 3; //3个线程
static int finishedThread=0;//和 线程数 有关  ,记录每一个线程是否执行完毕

public static void main(String[] args) throws IOException {

    //统一资源管理器  ,可以直接打开 网络地址
    URL url  = new URL(XiaZaiTest.path);
    //因为基于http请求 , 获取HttpURLConnection   , 获取网络链接对象 ,就可以和服务器建立链接
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    //设置一些参数
    conn.setRequestMethod("GET");   //get请求
    conn.setConnectTimeout(5000);   //链接超时
    conn.setReadTimeout(5000);      //读取超时

    if(conn.getResponseCode()==200){
        //1. 拿到 文件总长 (总大小)
        int contentLength = conn.getContentLength();
        //2. 每个线程下载的大小
        int size = contentLength/threadCount;
        //3.开启线程执行下载
        for (int i = 0; i < threadCount; i++) {
            int startIndex = i*size;        // (i从0开始 )
            int endIndex = (i+1)*size;     //结束位置
            XiaZai thread = new XiaZai(startIndex,endIndex,i);
            thread.start();
        }
    }
}
}

简单线程继承

package Xianchengti;
public class Threaddemo1 extends Thread{

@Override
public void run() {
    System.out.println("继承线程extends~~~~~");
}

public static void main(String[] args) {
    Threaddemo1 td1 = new Threaddemo1();
    td1.start();
    Threaddemo1 td2 = new Threaddemo1();
    td2.start();
}
}

实现Runable接口的线程

package Xianchengti;
//实现接口
public class Threaddemo2 implements Runnable{

@Override
public void run() {
    System.out.println("实现Runable接口的线程~~~~~");
}

public static void main(String[] args) {
    Threaddemo2 td1 = new Threaddemo2();
    Thread th1 = new Thread(td1);
    th1.start();

    Threaddemo2 td2 = new Threaddemo2();
    Thread th2 = new Thread(td1);
    th2.start();
}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值