我要计算当前百分比在我的多线程下载programme.But有一个奇怪的问题。第二次下载期间的lastDownloadSize必须是lastDown的写和lastDownloadSize之和。示例
这是我的密码
private long getDownloadSize() {
synchronized (this) {
final AtomicLong totalWriteCount = new AtomicLong(0);
final AtomicLong lastDownloadSize = new AtomicLong(0);
for (DownloadTask task : downloadTasks) {
final long writeCount = task.getWriteCount();
totalWriteCount.addAndGet(writeCount);
final long downloadSize = task.getPosition().getDownloadSize();
lastDownloadSize.addAndGet(downloadSize);
}
System.out.println("===== writeCount : " + totalWriteCount + "lastDownloadSize : " + lastDownloadSize);
return totalWriteCount.addAndGet(lastDownloadSize.get());
}
}发布于 2018-06-01 06:45:19
totalWriteCount和lastDownloadSize变量是getDownloadSize()方法的局部变量。在这种情况下,使用AtomicLong没有意义,因为只有一个线程可以访问它们。
您可能的意思是,让totalWriteCount和lastDownloadSize成为您类的成员:
class SomeClass {
// ...
final AtomicLong totalWriteCount = new AtomicLong(0);
final AtomicLong lastDownloadSize = new AtomicLong(0);
// ...
private long getDownloadSize() {
synchronized (this) {
for (DownloadTask task : downloadTasks) {
final long writeCount = task.getWriteCount();
totalWriteCount.addAndGet(writeCount);
final long downloadSize = task.getPosition().getDownloadSize();
lastDownloadSize.addAndGet(downloadSize);
}
System.out.println("===== writeCount : " + totalWriteCount + "lastDownloadSize : " + lastDownloadSize);
return totalWriteCount.addAndGet(lastDownloadSize.get());
}
}
}但是,在这种情况下,如果只从synchronized(this)块中访问它们,则不需要使用AtomicLong块,因为同步块已经确保它们仅由单个线程同时访问。
发布于 2018-06-01 06:46:41
您的当前设置无法工作,因为您使用AtomicLong的方式不对。在单个线程中定义任何Atomic-class都是对该API的错误使用。
为什么我说单线程,当有人进入您的方法时,您正在同步,这只是说一次只有一个线程可以使用所述的方法。这就引出了一个问题:
AtomicLong是一个局部变量您可能希望将downloadSize和totalWriteCount定义为class的成员。例如:
public class YourClass {
private final AtomicLong totalWriteCount = new AtomicLong(0);
private final AtomicLong downloadSize = new AtomicLong(0);
/* constructors and other methods */
private synchronized long getDownloadSize() {
for (DownloadTask task : downloadTasks) {
final long writeCount = task.getWriteCount();
totalWriteCount.addAndGet(writeCount);
final long downloadSize = task.getPosition().getDownloadSize();
lastDownloadSize.addAndGet(downloadSize);
}
System.out.println("===== writeCount : " + totalWriteCount + "lastDownloadSize : " + lastDownloadSize);
return totalWriteCount.addAndGet(lastDownloadSize.get());
}
}https://stackoverflow.com/questions/50637384
复制相似问题