java - 线程的行为与我认为的相反
问题描述
只需导入随机数并计数。负数 , even_positive , even_negative ; 任务是查看多线程工作减少执行时间;通过)在主函数和多线程中执行相同的任务;
代码 1)
首先我创建了一个实现Runnable
. 那个单一的班级完成了所有的计数工作。但是根据我的说法,每个函数(谈论run()
方法内部的函数调用)都是在前一个函数结束时执行的,因此甚至应该增加时间,因为我们要循环 3 次以获取相同的数据。但令我惊讶的是,执行时间比简单地计算主函数中的一个循环要少;
代码 2)
在第二种情况下,我创建了 3 个类实现Runnable
接口,以便我的所有进程都可以并发,因此应该减少时间。但令我惊讶的是,相反的情况发生了。对于同一任务,它比 main 函数中的单个循环花费更多的时间;
import java.util.Random;
class ThreadClass implements Runnable {
private int[] random;
public ThreadClass(int[] a) {
random=a;
}
int neg(int[] random) {
int nega=0;
for(int i=0;i<10000;i++) {
if (random[i] < 0)
nega++;
}
return nega;
}
int posiEven(int[] random) {
int posEven=0;
for(int i=0;i<10000;i++) {
if (random[i] > 0){
if(random[i]%2==0)
posEven++;
}
}
return posEven;
}
int posiOdd(int[] random) {
int posOdd=0;
for(int i=0;i<10000;i++) {
if (random[i] > 0){
if(random[i]%2!=0)
posOdd++;
}
}
return posOdd;
}
@Override
public void run() {
System.out.println("negative, positive odd, positive even "+neg(random)+" "+posiOdd(random)+"
"+posiEven(random));
}
}
public class Lab6_Q2 {
public static void main(String[] args) {
int[] random = new int[10000];
Random r = new Random();
for(int i=0;i<10000;i++){
random[i]=r.nextInt(201)-100;
}
int neg=0,posEven=0,posOdd=0;
long startTime1 = System.nanoTime();
for(int i=0;i<10000;i++){
if(random[i]<0)
neg++;
else{
if(random[i]%2==0)
posEven++;
else
posOdd++;
}
}
long endTime1 = System.nanoTime();
System.out.println("negative, positive odd, positive even "+neg+" "+posOdd+" "+posEven);
System.out.println("Time taken without using multiple threads: "+(endTime1-startTime1)+" ns");
ThreadClass threadClass = new ThreadClass(random);
Thread t1 = new Thread(threadClass);
long startTime2 = System.nanoTime();
t1.start();
long endTime2 = System.nanoTime();
System.out.println("Time taken using multiple threads: "+(endTime2-startTime2)+" ns");
}
}
代码 2)
import java.util.Random;
class Negative implements Runnable
{
private int[] random;
int neg;
public Negative(int[] a)
{
random=a;
neg= 0;
}
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println("in_negative");
if (random[i] < 0)
neg++;
}
}
}
class Positive_even implements Runnable
{
private int random[];
int pos_even;
public Positive_even(int a[])
{
random = a;
pos_even = 0;
}
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println("in_pos_even");
if (random[i] > 0)
{
if(random[i]%2==0)
pos_even++;
}
}
}
}
class positive_odd implements Runnable
{
private int random[];
int pos_odd;
public positive_odd(int a[])
{
random = a;
pos_odd = 0;
}
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println("in_pos_odd");
if (random[i] > 0)
{
if(random[i]%2 != 0)
pos_odd++;
}
}
}
}
public class Lab6_Ques2
{
public static void main(String[] args)
{
int[] random = new int[10];
Random r = new Random();
for(int i=0;i<10;i++)
{
random[i]=r.nextInt(20)-10;
}
int neg=0,posEven=0,posOdd=0;
long startTime1 = System.nanoTime();
for(int i=0;i<10;i++){
if(random[i]<0)
neg++;
else{
if(random[i]%2==0)
posEven++;
else
posOdd++;
}
}
long endTime1 = System.nanoTime();
System.out.println("negative, positive odd, positive even "+neg+" "+posOdd+" "+posEven);
System.out.println("Time taken without using multiple threads: "+(endTime1-startTime1)+" ns");
Negative threadClass1 = new Negative(random);
Thread t1 = new Thread(threadClass1);
Positive_even threadClass2 = new Positive_even(random);
Thread t2 = new Thread(threadClass2);
positive_odd threadClass3 = new positive_odd(random);
Thread t3 = new Thread(threadClass3);
long startTime2 = System.nanoTime();
t1.start();
t2.start();
t3.start();
long endTime2 = System.nanoTime();
System.out.println("Time taken using multiple threads: "+(endTime2-startTime2)+" ns");
}
}
解决方案
推荐阅读
- python - Python defaultdict 深度嵌套数据结构
- reactjs - ReactJS,上传文件时尝试将url图片插入数据库
- neo4j - 如何将手动 APOC 索引添加到包含字符串列表的属性
- google-cloud-storage - Google Dataflow Pipeline 创建失败并显示 400:错误请求/无效授权
- symfony - LiipImagineBundle + KNPGaufrette + VichUploaderBundle + Amazon S3 无法在 S3 上生成缩略图
- c - 斐波那契数列在 C 中的第 50 个数字的计数处给出分段错误
- java - 使用 Appium 安装和跳过未经验证的应用程序消息
- git - git merge-base --fork-point什么也没产生
- angular - 带有 Ionic 4 的 SQLite?无法读取未定义类型错误的属性“then”:无法读取未定义的属性“then”
- bash - 在bash中根据日期创建密码轮换列表