java 初学多线程

Posted 呐呐呐那

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 初学多线程相关的知识,希望对你有一定的参考价值。

什么是进程?

例如:

 

这些每个都是一个进程,每个进程都有好多功能,这些功能同时运行走的就是线程,多线程

一个进程会有多个线程或者一个线程,是一对多的关系

进程:一个程序进入内存就可以叫做进程

线程:线程是进程的一个执行单元(功能),可以多个线程一起执行

程序运行原理

java是抢占式调度,就是cpu会随机分配时间运行哪个线程时间长一点,执行的多一些。cpu会高速的在每个线程之间来回切换,但是某个时刻只能执行一个线程,

多线程并不能提高程序的运行速度,但是可以提高程序的运行效率,让cpu的使用率更高

分时调度:cpu平均分配时间,每个线程的时间是一样的

主线程

就是我们常用的main()方法,当JVM启动后,必然有一个方法从mian方法开始,到结束。才能执行mian下面的别的方法,依次执行。

Tread类

构造方法

常用方法

写一个新的类,然后继承Thread类,声明这是一个新的线程,将要执行的程序写在新的类里面,方法名run,在mian方法里用start调用

 1 package com.oracle.Demo02;
 2 
 3 public class Demo1 extends Thread {
 4     //JVM去找OS开了2条路径
 5     //对于CPU来说就有了2条路径,这2条路径都会被CPU执行,CPU有自己选择的权利,所以就有了随机性,
 6     //也可以理解为2个线程在抢夺CPU的资源(时间)
 7     public void run(){
 8         for(int i=0;i<100;i++){
 9             System.out.println("这是新建的线程"+i);
10         }
11     }
12 }
 1 package com.oracle.Demo02;
 2 
 3 public class test {
 4 
 5     public static void main(String[] args) {
 6         Demo1 de = new Demo1();
 7         //开启线程。start方法会在后台调用run方法
 8         de.start();
 9         for(int i=0;i<100;i++){
10             System.out.println("这是主线程"+i);
11         }

练习:

给我创建三个线程,一个方法是打印1000以内的水仙花数,
一个方法是打印1000以内的所有偶数,一个方法是循环打印1000个数

 1 package com.oracle.Demo02;
 2 
 3 public class Demo02 extends Thread {
 4     public void run(){
 5         for(int i=1;i<=1000;i++){
 6             int a = i%10;
 7             int b = (i/10)%10;
 8             int c = i/100%10;
 9             if((a*a*a+b*b*b+c*c*c)==i){
10                 System.out.println("水仙花数"+i);
11 
12             }
13         }
14     }
15 }
 1 package com.oracle.Demo02;
 2 
 3 public class Demo03 extends Thread{
 4     public void run(){
 5         for(int i=1;i<=100;i++){
 6             if(i%2==0){
 7                 System.out.println("偶数"+i);
 8             }
 9         }
10     }
11 }
package com.oracle.Demo02;

public class test {

    public static void main(String[] args) {
        Demo02 de = new Demo02();
        de.start();   创建第一个线程
        Demo03 dee = new Demo03();
        dee.start();    创建第二个线程
        for(int i =0;i<=1000;i++){    主线程
            System.out.println(i);
        }
        
    }

}

 sleep方法,休眠,时间到了自然醒来

 1 package com.oracle.Demo03;
 2 
 3 public class Demo03 extends Thread{
 4     public void run(){
 5         for(int i=0;i<10;i++){
 6             System.out.println(""+i);
 7             //因为Thread没有声明异常所以只能用try()catch()来解决异常
 8             try {
 9                 sleep(2000);     //休眠2秒
10             } catch (InterruptedException e) {
11                 // TODO 自动生成的 catch 块
12                 e.printStackTrace();
13             }
14         }
15     }
16 }
 1 package com.oracle.Demo03;
 2 
 3 public class Test03 {
 4 
 5     public static void main(String[] args) throws InterruptedException {
 6         // TODO 自动生成的方法存根
 7         Demo03 de = new Demo03();
 8         //获取main方法的对象
 9         Thread th = Thread.currentThread();
10         de.start();
11         for(int i=0;i<10;i++){
12             System.out.println("main"+i);
13             th.sleep(2000);   //main方法休眠2秒
14         }
15     }
16 
17 }

线程的状态

 

 

 

以上是关于java 初学多线程的主要内容,如果未能解决你的问题,请参考以下文章

java初学多线程

初学Java多线程的基本概念

java线程初学(粗糙)

初学Java多线程:使用Synchronized块同步方法

java学习——多线程

Java多线程——Lock&Condition