在生活中,人体可以同时进行各项生命活动。例如,人体可以同时进行呼吸、血液循环等等…
当我们在编写程序时,这些行为我们可以抽象为并发,而将并发完成的每一件事称为线程

线程创建的两种传统方式
方式一继承Thread类
1.创建Thread类的子类
2.重写Thread类的run()方法,将当前线程要执行的操作声明在run()方法内!
3.实例化Thread类的子类
4通过Thread类的子类对对象调用start()方法,来启动线程

方式二实现Runnable接口
1.创建实现类来实现Runnable接口
2.实现接口中的抽象方法run(),将当前线程要执行的操作声明在run()方法体内
3.创建实现类的对象
4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
5.通过Thread类的对象调用start(),启动线程

例题:编写10个线程,第一个线程从1加到10,第二个线程从11加到20……第十个线程从91加到100, 最后再将10个线程结果相加。

方式一实现:
public class Test {

public static void main(String[] args) throws InterruptedException {for(int i = 0; i< 10;i++){Add add = new Add(i*10+1,i*10+10);add.start();}Thread.sleep(50);System.out.println("总和:"+Add.sum);
}

}

class Add extends Thread
{
static Object object = new Object();
static int sum;

private int begin;//首
private int over;//尾public Add(int begin,int over)
{this.begin = begin;this.over = over;
}private int temp;
public void run()
{for(int i = begin;i<= over;i++){temp += i;}//同步代码块synchronized(object){System.out.println(Thread.currentThread().getName()+"----"+temp);sum += temp;}
}

}

结果展示:

方式二实现
public class Test {
public static void main(String[] args) {
ABCD abcd = new ABCD();
Thread[] all = new Thread[10];
for(int i=0; i<10; i++)
{
all[i] = new Thread(abcd);
all[i].start();
}
try {
for(int i=0; i<10; i++)
{
all[i].join();
}
} catch (InterruptedException e)
{
e.printStackTrace();
}

 System.out.println("总和:"+ABCD.getSum());
}

}
class ABCD implements Runnable{
private static Object lock = new Object();
private static int sum = 0;
private static int num=1;

public void run()
{synchronized(lock){for(int i = 1;i<= 10;i++,num++){sum +=num;System.out.println(Thread.currentThread().getName()+":"+num);}  }
}public static int getSum()
{return sum;
}

}

结果展示:

上述两种方式的比对
相同点:
1、都需要对run()方法进行重写
2、启动线程都需要调用Thread类的start()方法
比较:
1、类可以实现多个接口,但只能继承一个父类
2、实现的Runna方式适合于资源的共享
结论:
在多线程的条件下,实现Runnable的方式要好于继承Thread的方式

小彩蛋
超级好懂的程序,适合自学的道友
public class Test {

public static int sum=0;
public static Object LOCK=new Object();class Threadtest extends Thread{private int begin;private int end;public void run() {synchronized (LOCK) {for(int i=begin;i<=end;i++){sum+=i;}System.out.println(Thread.currentThread().getName()+"---:"+sum);}}public Threadtest(int begin, int end) {this.begin = begin;this.end = end;}
}
public static void main(String[] args)throws InterruptedException {Test t11 =new Test();Threadtest t1=t11.new Threadtest(1, 10);t1.setName("1号");Threadtest t2=t11.new Threadtest(11, 20);t2.setName("2号");Threadtest t3=t11.new Threadtest(21, 30);t3.setName("3号");Threadtest t4=t11.new Threadtest(31, 40);t4.setName("4号");Threadtest t5=t11.new Threadtest(41, 50);t5.setName("5号");Threadtest t6=t11.new Threadtest(51, 60);t6.setName("6号");Threadtest t7=t11.new Threadtest(61, 70);t7.setName("7号");Threadtest t8=t11.new Threadtest(71, 80);t8.setName("8号");Threadtest t9=t11.new Threadtest(81, 90);t9.setName("9号");Threadtest t10=t11.new Threadtest(91, 100);t10.setName("10号");t1.start();t2.start();t3.start();t4.start();t5.start();t6.start();t7.start();t8.start();t9.start();t10.start();t1.join();t2.join();t3.join();t4.join();t5.join();t6.join();t7.join();t8.join();t9.join();t10.join();System.out.println("总和:"+sum);
}

}
结果展示

线程简易的生命周期图

ps:万物皆对象,你有对象吗?

java:编写10个线程,第一个线程从1加到10,第二个线程从11加到20……第十个线程从91加到100, 最后再,10个线程结果相加相关推荐

  1. 14. 编写递归函数,在第一行打印输出1个1,在第二行输出2个2,。。。,在第n行输出n个n。

    编写递归函数,在第一行打印输出1个1,在第二行输出2个2,...,在第n行输出n个n. #include <stdio.h> void print(int n) {if(n==1) pri ...

  2. (编写两个线程第一个计算2-10万的质数,第二个10万-20万的质数)

    public class Main3 extends Thread{int i,j,x=0;Main3(int m,int n){this.i = m;this.j = n;}public void ...

  3. 01编写10个线程,第一个线程从1加到10,第二个线程从11加20…第十个线程从91加到100,最后再把10个线程结果相加。

    01编写10个线程,第一个线程从1加到10,第二个线程从11加20-第十个线程从91加到100,最后再把10个线程结果相加(递归算法). 要求很明了:就是要求10个线程,每个线程执行加操作,然后顺序执 ...

  4. 编写10个线程,第一个线程从1加到10,第二个线程从11加到20…第十个线程从91加到100, 最后再把10个线程结果相加。

    package net.paoyun.day18.thread.zuoye; /**  * 编写10个线程,第一个线程从1加到10,第二个线程从11加到20-第十个线程从91加到100, 最后再把10 ...

  5. 线程池如何保证所有子线程运行完再执行主线程

    Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,比如说主线程要返回一个响应用户的值,但这个值得赋值过程是由过个子线程来完成的(模拟一个实际开发的情景),所以主线程必须等待子线 ...

  6. JAVA编写PTA(10分)

    L1-007 念数字 (10 分) 输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出fu字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: ...

  7. 用Java编写第一个区块链(二)

    用Java编写第一个区块链(二) 这篇文章将去介绍如何使用区块链进行交易. [本文禁止任何形式的全文粘贴式转载,本文来自 zacky31 的随笔] 目标: 在上一篇文章中,我们已经创建了一个可信任的区 ...

  8. Java黑皮书课后题第4章:4.22(检测子串)编写一个程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串

    4.22(检测子串)编写一个程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串 题目 题目概述 运行示例 破题:String方法.属性的使用 代码 题目 题目概述 4.22(检测子 ...

  9. Java学习第七天 ———— 第一周学习汇总(粗略)

    Java学习第七天 ---- 第一周学习汇总 第一章Java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大 ...

最新文章

  1. 脑洞一下 | 产品经理是如何用一张小票推算店面房租的?
  2. Yum database disk image is malformed 错误
  3. 省市县联动javascript版..
  4. 冻结拆分_还不会固定表头?速来围观Excel冻结窗格实战教程
  5. 如何使用Redis做MySQL的缓存
  6. jetty java web_i-jetty 下的JavaWeb开发(一)
  7. go按行读取数据的坑
  8. (十七)Activitivi5之组任务分配
  9. 华为hg255d+Openwrt锐捷认证在某农业公园
  10. D8(YT88)加密狗破解与加密工具
  11. wifi分析仪怎么看哪个信道好_wifi分析仪如何检测周围wifi信号 wifi分析仪使用方法【详解】...
  12. 使用nginx负载均衡器提高并发量
  13. Android Studio中使用android:src=quot;@drawable/ic_launcherquot;报错
  14. 已解决:Execution failed for task Unable to delete directory:D:\VPRO\Vo\build\.....
  15. python大数据是什么_python和大数据有什么关系?
  16. 自研·学术·文献查找
  17. unity urp 实现丝绸渲染
  18. 牛客网项目——前置技术(四):项目调试技巧
  19. java画乌龟_用java代码画乌龟,还要能让它爬。
  20. 王和平的《计算机是怎样跑起来的》学习笔记

热门文章

  1. 深度学习中的without bells and whistles是什么意思?
  2. 压铸人的火眼金睛 | 智铸超云案例分享
  3. 进制转化——十进制转二进制
  4. html中百分比都支持吗,響應式設計中百分比%的問題_html/css_WEB-ITnose
  5. vue项目该不该使用eslint验证?
  6. 深入理解 Java中的 流 (Stream)
  7. 关于认知力的学习总结
  8. 【Python实战】 ---- 爬虫 爬取LOL英雄皮肤图片
  9. Python在线聊天
  10. 网安零基础学习-python-正则表达式(灰帽编程17)