美文网首页
Java多线程

Java多线程

作者: 慵懒的阳光丶 | 来源:发表于2019-06-19 13:39 被阅读0次

1.概念

  • 程序:是为了完成指定任务,用某种语言编写的一组指令的集合,即一段静态的代码。
  • 进程:是程序的一次执行过程,或是正在运行的一个程序。动态过程:有它自身的产生,运行,和消亡的过程。
    如:运行中的QQ、微信,程序是静态的,但运行是动态的。
  • 线程:进程可进一步细化为线程,是一个程序内部的一个执行路径。
    例如:QQ可以同时发送消息聊天,听QQ音乐,下载聊天内容等,这些功能就是多线程的提现

2.创建新线程的方式

import java.util.concurrent.*;

/**
 * 创建线程的两种方式
 * |-----继承Thread类,重新run方法,调用子类的start方法
 * |-----实现runnable接口,重写run方法,new Thread(runnable).start
 * |-----实现Callable接口配合FutureTask
 * |-----线程池创建线程
 */
@SuppressWarnings("all")
public class Thread1 {
    public static void main(String[] args) {
        /**
         * 继承Thread类新建线程
         */
        NewThread newThread = new NewThread();
        newThread.start();

        /**
         * 实现runnable接口新建线程
         */
        Thread thread = new Thread(new NewThread1());
        thread.start();

        /**
         * 匿名类的方式创建新线程
         */
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程3");
            }
        }).start();

        /**
         * lambda表达式方式创建新线程
         */

        Runnable runnable = () -> System.out.println("线程4");
        Thread thread1 = new Thread(runnable);
        thread1.start();

        /**
         * 实现Callable接口配合FutureTask创建新线程
         */
        NewThread2 callable = new NewThread2();
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread thread2 = new Thread(futureTask);
        thread2.start();
        try {
            Integer num = futureTask.get();
            System.out.println(num);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        /**
         * lambda表达式创建callable方式线程
         *
         */

        Callable<Integer> callable1 = () ->300 ;
        FutureTask<Integer> futureTask1 = new FutureTask<>(callable1);
        new Thread(futureTask1).start();
        try {
            Integer num1 = futureTask1.get();
            System.out.println(num1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        /**
         * 通过线程池方式创建
         * jdk5.0之后提供了创建线程池的方式
         */

        Runnable runnable1 = () -> System.out.println("线程池创建的线程");
        Callable<String> callable2 = () ->"110";
        ExecutorService executorService = Executors.newFixedThreadPool(2);
//        executorService.submit(runnable1);
        Future<String> future = executorService.submit(callable2);
        try {
            String s = future.get();
            System.out.println(s);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }


    }
}

class NewThread extends Thread{
    @Override
    public void run() {
        super.run();
        System.out.println("线程1");
    }
}

class NewThread1 implements Runnable{

    @Override
    public void run() {
        System.out.println("线程2");
    }
}

class NewThread2 implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {
        int sum = 0;

        for (int i = 0; i <= 100; i++) {
            sum += i;
        }

        return sum;
    }
}

3.线程常用方法

/**
 * Thread类的常用方法的测试
 * 1.run():Thread的子类一定要重写的方法。将此分线程要执行的操作,声明在run()中
 * 2.start():要想启动一个分线程,就需要调用start():①启动线程②调用线程的run()
 * 3.currentThread():静态方法,获取当前的线程
 * 4.getName():获取当前线程的名字
 * 5.setName(String name):设置当前线程的名字
 * 6.yield():当前线程调用此方法,释放CPU的执行权
 * 7.join():在线程a中调用线程b的join()方法:只有当线程b执行结束以后,线程a结束阻塞状态,继续执行。
 * 8.sleep(long millitimes):让当前的线程睡眠millitimes毫秒
 * 9.isAlive():判断当前线程是否存活
 * 
 * 10.线程的优先级:
 *      MAX_PRIORITY:10
 *      NORM_PRIORITY:5 ---默认优先级
 *      MIN_PRIORITY:1
 * 
 *   设置优先级:setPriority(int priority); 
 *   获取优先级:getPriority();
 *   
 *   设置优先级以后,对高优先级,使用优先调度的抢占式策略,抢占低优先级的执行。但是并不意味着高优先级的线程一定先于低
 *   优先级的线程执行,而是从概率上来讲,概率更大而已。
 * 
 * 
 * 线程通信:wait() / notify() / notifyAll()  ---->java.lang.Object类中定义的方法
 * 
 */
class NumberThread extends Thread{
     public void run() {
     }
     
}



public class ThreadMethodTest {
    public static void main(String[] args) {
        NumberThread t1 = new NumberThread();

        //getName():获取当前线程的名字
        System.out.println(Thread.currentThread().getName());

        Thread.currentThread().setName("新线程");

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

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

        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

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

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

        t1.start();

        System.out.println(t1.getName());
        System.out.println(t1.getPriority());


    }
}

相关文章

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

  • 带你搞懂Java多线程(六)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四)带...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • java多线程--Callable

    **移步[java多线程系列文章]Java多线程(二十二)---LockSupport工具Java 停止线程 一、...

  • android 多线程 — 线程的面试题和答案

    这里都是我从各个地方找来的资料,鸣谢: Java多线程干货系列—(一)Java多线程基础 JAVA多线程和并发基础...

  • 5月份第一周学习安排

    学习内容: java多线程及线程同步的方法(使用) java多线程各种同步方法的原理和优缺点 java多线程设计模...

  • 带你搞懂Java多线程(四)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三) 什么是线程间的协作 线程之间...

  • Java基础(六)

    多线程 Java多线程并发 1.1 JAVA 并发知识库 1.2 JAVA 线程实现/创建方式 1.2.1 继承 ...

  • (五) volatile关键字

    Java多线程目录 1 背景 理解Java多线程的内存抽象逻辑请阅读java多线程内存模型,当代操作系统,处理器为...

  • Java多线程高级特性(JDK8)

    [TOC] 一、Java多线程 1.Java多线程基础知识 Java 给多线程编程提供了内置的支持。一条线程指的是...

网友评论

      本文标题:Java多线程

      本文链接:https://www.haomeiwen.com/subject/crjxqctx.html