Создание потоков для загрузки файла и создания счетчика Java

Я пытаюсь сделать программу, которая загружает файл. При загрузке файла необходим базовый счетчик, который отсчитывает от начала до конца. Эти две функции должны быть в своих собственных потоках. Я создал метод / поток для загрузки файла. У меня проблемы с выяснением, как сделать основной счетчик. Ничего сложного, но для этого нужно посчитать и отобразить только текущий номер. Любая помощь будет оценена.

import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import static myutilites.methods.*;


public class Downloader
{

public static void main(String[] args) throws IOException
{
    String filename = "Nexus5MahdiRom.zip";
    URL link = new URL(
    "http://files.mahdi-rom.com/OnePlus%20One/"
    + "OnePlus%20One%20Builds/mahdi-2.7-bacon-20140903.zip");

    Thread t1 = new Thread(new Runnable()
    {
        @Override
        public void run() 
        {
            try 
            {
                downloadFile(filename,link);
            } catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    });

    Thread t2 = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            try {
                counter(link, t1);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

    t1.start();
    println("Downloading File...");
}

public void getScreenSize()
{
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension d = tk.getScreenSize();
    println("width = " + d.width + " height = " + d.height);
}
public static void downloadFile(String fileName, URL link) throws IOException
{
    InputStream in = new BufferedInputStream(link.openStream());
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte [] buf = new byte[1024];
    int n = 0;
    int count = 0;

    while (-1 !=(n=in.read(buf)))
    {
        out.write(buf, 0, n);
    }
    println(count);
    out.close();
    in.close();

    byte[] response = out.toByteArray();

    FileOutputStream fos = new FileOutputStream(fileName);
    fos.write(response);
    fos.close();

    println("Download Finished");
}
public static void locate(int row, int col)
{
    System.out.print("\033["+row+";"+col+"H");
}
public static int counter(URL link, Thread t1) throws IOException
{
    int count = 0;
    link.openConnection();
    while(t1.isAlive())
    {
        count++;
        return count;
    }
    return count;
}
}

1 ответ

Использование getAndIncrement или же incrementAndGet в AtomicInteger, который является потокобезопасным счетчиком (со счетчиком, инициализированным в 0, если два потока одновременно вызывают incrementAndGet тогда вы гарантируете, что счетчик вернет 1 в один поток и 2 в другой поток и будет иметь конечное состояние 2)

Другие вопросы по тегам