码迷,mamicode.com
首页 > 编程语言 > 详细

java-多线程

时间:2020-06-25 15:40:37      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:str   rri   主程序   read   main方法   oid   main   package   名称   

技术图片

 

并发性是一系列性能技术,专注于减少等待

如果你的程序中的一个任务由于程序控制之外的某些条件(通常是I/O)而无法继续,我们会说任务或线程阻塞

 

 进程和线程

技术图片

 

 技术图片

 

 

技术图片

 

 线程的调度:

分时调用
    所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间
抢占式调度
    优先让优先级较高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),
  java使用的为抢占式调度

技术图片

 

 主线程

/*
主程序:执行主方法的线程

单线程程序:java程序中只有一个线程
执行从main方法开始,从上到下一次执行
 */

技术图片

 单线程程序

public class Demo1Test {
    public static void main(String[] args) {
        Person p1 = new Person("xiaoqiang");
        p1.run();

        Person p2 = new Person("wacai");
        p2.run();
    }
}

 

技术图片

 

 

 

创建线程累

 

/*
创建多线程程序的第一种方式,创建Thread的子类
    实现多线程程序,必须继承Thread累
实现步骤
    1创建一个子类
    2再Thread得子类中重写run方法,设置线程任务
    3创建子类实例对象
    4调用Thread累得方法start,开启心得线程,。执行run方法
        void start() 使线程开始执行,JVM调用该线程得run方法
        结果使两个线程并发运行,当前线程(main)线程,和另外一个线程
        多次启动同一个线程使非法得,特别是当线程已经执行接受,不能在重新启动

java程序属于抢占式调度,那个线程优先级高,哪个线程优先执行,
同一个优先级,随机调度
 */

 

创建子类:

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("done:"+i);
        }
    }
}

实例化子类并调用start方法:

public class Demo2Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("maindone:" + i);
        }
    }
}

结果

技术图片
maindone:0
done:0
done:1
done:2
done:3
done:4
done:5
done:6
done:7
maindone:1
maindone:2
maindone:3
maindone:4
maindone:5
maindone:6
maindone:7
maindone:8
maindone:9
maindone:10
maindone:11
maindone:12
maindone:13
maindone:14
maindone:15
maindone:16
maindone:17
done:8
done:9
done:10
done:11
done:12
done:13
done:14
done:15
done:16
maindone:18
maindone:19
done:17
done:18
done:19
View Code

 

分析,

技术图片

 

 

简单而言:

技术图片

 

 

 

Thread累

 

技术图片

 

 

获取线程名字1111

创建Thread子累:

public class MyThread extends Thread{
    @Override
    public void run() {
      String ThreadName= getName();
        System.out.println(ThreadName);
    }
}

 

实例化:

public class Demo2Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();

        MyThread myThread2 = new MyThread();
        myThread2.start();
    }
}

/*
Thread-0
Thread-1
 */

 

获取线程名字2222

子类修改

public class MyThread extends Thread{
    @Override
    public void run() {
//      String ThreadName= getName();
//        System.out.println(ThreadName);
        //获取当前运行的线程,引用
        Thread ct = Thread.currentThread();
        System.out.println(ct);
        System.out.println(ct.getName());
    }
}

简化语句:链式编程

System.out.println(Thread.currentThread().getName());

结果:

Thread[Thread-0,5,main]
Thread-0
Thread[Thread-1,5,main]
Thread-1

 

设置线程名称 setName

技术图片

 

子类:

 

public class MyThread extends Thread{

    public MyThread() {
    }

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

 

 

 

public class Demo2Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread("quan");
        myThread.start();

        MyThread myThread2 = new MyThread();
        myThread2.start();


    }
}

/*
quan
Thread-0
 */

 

线程睡眠方法:sleep

技术图片

 

 静态方法,直接调用

public class Demo2Test {
    public static void main(String[] args) {

        for (int i = 1; i < 60; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

 

创建线程的第二种方式

技术图片

 

 

实现接口累,必须重载

package Thread;

public class RunnableImpl implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}

 

public class Demo2Test {
    public static void main(String[] args) {
        RunnableImpl runn = new RunnableImpl();
        //传入runnable对象
        Thread td = new Thread(runn);
        //掉用start方法
        td.start();

        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}

/*
main0
Thread-00
main1
Thread-01
Thread-02
Thread-03
 */

 

继承Thread和实现Runnable接口的区别

技术图片

 

 我们可以按照不同的需求去将实现累修改,传入不同的实现类给Thread的构造方法就行

建议使用Runnable

技术图片

 

 

 

使用匿名内部类方式实现线程的创建

技术图片

 

 

public class DemoTest3 {
    public static void main(String[] args) {
        //匿名内部类,线程父类是Thread
        new Thread() {
            //重写run方法
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName() + "---" + i);
                }
            }
        }.start();//创建完子类调用start开启线程

        //匿名内部类,父类是Runnable接口
        //利用接口等于一个实现接口的类---多态
        Runnable runn = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName() + "---" + i);
                }
            }
        };
        Thread th = new Thread(runn);
        th.start();


        //或则:
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName() + "---" + i);
                }
            }
        }).start();
        //再或者:lambda表达式
        new Thread(()->{
            for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName() + "---" + i);
        }
        }).start();
    }
}

 

java-多线程

标签:str   rri   主程序   read   main方法   oid   main   package   名称   

原文地址:https://www.cnblogs.com/java-quan/p/13022618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!