java开启多线程的方式,第一种是新建一个Thread的子类,然后重写它的run()方法就可以,调用类的对象的start()方法,jvm就会新开一个线程执行run()方法.

第二种是类实现Runable接口,然后重写run()方法,把这个类的对象当做参数传递给线程的构造函数.如 new Thread(xxx),xxx就是实现了Runable的类,这种方法会把xxx赋值给一个成员变量target,Thread的run方法会判断这个成员变量如果不为空,那么就会执行target.run()方法.

还有两种方法,一种是使用匿名内部类, new Thread() { public void run(){} }.start(); 在匿名内部类中重写run()方法.也可以在Thread新建时给构造函数传一个Runable接口的匿名内部类对象.如 new Thread(new Runnable() { public void run(){} }).start();上边一种是Thread的匿名内部类对象,下面一种是Runnable接口的匿名内部类对象.

另一种是new Thread的时候传递进去一个lambda表达式,如:new Thread(() -> { xxx }).start();

可以用 new Thread("name") 用构造函数给线程设置名字,也可以用 setName()方法设置名字,用getName()方法获取线程名字,在线程内的run()方法中可以用 this.getName()的方式获取当前线程名字. 用Thread.currentThread()方法可以获取当前线程的引用.

休眠线程: Thread.sleep(),可以让线程休眠多少毫秒.多少毫秒之后再运行.
守护线程: thread.setDaemon(true) 把一个线程设置为守护线程,当别的所有线程执行完之后,守护线程强制退出.
加入线程: 在线程2中某个地方加入thread1.join()方法,则线程2会在这个地方停止,等待线程1执行完成之后再继续执行.join方法还可以指定时间,让thread1执行多少毫秒.
礼让线程: thread.yield()方法可以让当前线程让出CPU,即让CPU先去执行别的任务.(有效果,但不是很明显)

线程默认优先级为5 最小优先级为1,最大优先级为10,可以用setPriority()方法设置优先级.Thread.MAX_PRIORITY是常量10,Thread.MIN_PRIORITY是常量1.

synchronized() { } 是同步代码块,里面的代码是同步执行的,小括号里是锁,可以任意声明一个对象当做锁,不过多个同步代码块里面的代码如果想同步执行的话必须要用一把锁,即同一个引用.如 final Integer lock = 1; synchronized(lock) {xxxxxxx}

非静态的同步方法只需要在方法声明上加 synchronized关键字即可,锁对象是this,静态的方法因为直接可以用类名.方法名调用,所以锁对象是当前类的字节码对象,即XXX.class

非线程安全的Collection或者Map子类对象如ArrayList等可以调用Collections.synchronizedXXX方法来获取支持同步的集合.

Runtime是一个运行时类,是一个单例类,可以用 Runtime.getRuntime()获取运行时对象,可以用exec()方法执行在cmd里面的命令.

Timer类是一个定时器,构造方法里面可以传入一个TimerTask子类对象,重写run()方法,用schedule()方法传入第一个参数TimerTask和第二个参数Date,到时间就会执行run()方法.schedule()方法还有第三个可选参数,就是循环执行,如传入3000,那么就会每隔3秒执行一次.

Object.notify() 随机唤醒单个等待线程, Object.notifyAll() 唤醒所有等待线程,Object.wait()让当前线程等待,可以传入时间参数.在同步代码块中,sleep是不释放锁的,而wait会释放锁.

ReentranLock是1.5版本的互斥锁,可以替换掉synchronized同步代码块使用,用ReentranLock.lock()加锁,unlock()解锁. ReentranLock.newCondition()是创建一个当前互斥锁的监视器,condition1.await()是让当前线程等待.condition1.signal()是唤醒condition1所在的线程.

ThreadGroup是线程组,默认创建的线程属于main线程组. new Thread(1, 2, 3) 1指定线程的组,2指定一个实现了Runnable接口的对象,3是线程的名字.

线程的五种状态: 1.新建: 创建线程对象, 2.就绪:已经启动,但是没有获取到CPU执行权, 3.运行:获取到了CPU,正在运行, 4.阻塞: 没有CPU的执行权,回到就绪, 5.死亡: 运行完毕,线程消亡.

ExecutorService 是线程池,可以用 Executors.newFixedThreadPool(2)来创建一个固定线程个数的线程池,用ExecutorService.submit()提交一个实现了Runnable接口的对象.用ExecutorService.shutdown()关闭线程池,不接受新的线程提交.

可以用Callable实现多线程,首先实现Callable<>接口,泛型是返回值的类型,重写call方法,然后把这个类的实例放到线程池中执行,用Future类接收返回对象,get方法获取返回值.

Java : java基础(4) 线程的更多相关文章

  1. Java并发基础:线程的创建

    线程的创建和管理: 1.应用Thread类显式创建.管理线程 2.应用Executor创建并管理线程. 定义任务: 无返回的任务:实现Runnable接口并编写run()方法. 有响应的任务:实现Ca ...

  2. Java并发基础06. 线程范围内共享数据

    假设现在有个公共的变量 data,有不同的线程都可以去操作它,如果在不同的线程对 data 操作完成后再去取这个 data,那么肯定会出现线程间的数据混乱问题,因为 A 线程在取 data 数据前可能 ...

  3. Java并发基础04. 线程技术之死锁问题

    我们知道,使用 synchronized 关键字可以有效的解决线程同步问题,但是如果不恰当的使用 synchronized 关键字的话也会出问题,即我们所说的死锁.死锁是这样一种情形:多个线程同时被阻 ...

  4. Java并发基础概念

    Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共 ...

  5. Java多线程基础知识总结

    2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...

  6. Java多线程基础:进程和线程之由来

    转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...

  7. Java并发基础:进程和线程之由来

    转载自:http://www.cnblogs.com/dolphin0520/p/3910667.html 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程. ...

  8. java并发基础(五)--- 线程池的使用

    第8章介绍的是线程池的使用,直接进入正题. 一.线程饥饿死锁和饱和策略 1.线程饥饿死锁 在线程池中,如果任务依赖其他任务,那么可能产生死锁.举个极端的例子,在单线程的Executor中,如果一个任务 ...

  9. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  10. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

随机推荐

  1. Android 笔记之 Android 系统架构

    Android笔记之Android系统架构 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: ...

  2. 获取cookie信息

    随着网络安全(例如:登录安全等)要求的不断提升,越来越多的登录应用在登录时添加了验证码登录,而验证码生成算法也在不断的进化,因而对含登录态的自动化测试脚本运行造成了一定程度的困扰,目前解决此种问题的方 ...

  3. matlab练习程序(单源最短路径Bellman-Ford)

    该算法可以用来解决一般(边的权值为负)的单源最短路径问题,而dijkstra只能解决权值非负的情况. 此算法使用松弛技术,对每一个顶点,逐步减少源到该顶点的路径的估计值,直到达到最短的路径. 算法运算 ...

  4. github代码上传教程

    github 上传代码步骤 一.git以及Github Git是个正快速成长的版本控制系统,它由GitHub维护. 优势: 1.支持离线开发,离线Repository. 2.强大的分支功能,适合多个独 ...

  5. 将CSV文件中的数据导入到SQL Server 数据库中

    导入数据时,需要注意 CSV 文件中的数据是否包含逗号以及双引号,存在时,导入会失败 选择数据库 -> 右键 -> 任务 -> 导入数据 ,然后根据弹出的导入导出向导(如下图)中的提 ...

  6. March 16 2017 Week 11 Thursday

    Adventure may hurt you, but monotony will kill you. 也许冒险会让你受伤,但一成不变会让你灭亡. The very theme of the univ ...

  7. HDU 6103

    题意: 求最长的两个不相交的子序列,dis <= m : 分析: 当时二分了答案,暴力匹配,TLE了,然后考虑了,O(n^2)预处理出所有区间 dis,然后答案是所有dis中>=m的最长长 ...

  8. Codeforces 385C 线性筛素数

    题意:给定一个数组,求[l,r] 区间,区间里的素数,数组中,能被这个素数整除的个数,再求和. 分析:区间很大,10^9了,找去区间内的素数是不可能的,但是,数组的数很小,而且要能整除区间内的素数,所 ...

  9. 【[SDOI2010]粟粟的书架】

    第一问的做法好像不太一样 首先第二问非常简单,直接在主席树上二分就好了,单次查询的复杂度\(O(logn)\) 第一问并没有想到有二分这种神仙操作,依旧用的是主席树 我们可以对矩阵建出主席树,也就是像 ...

  10. [USACO12FEB]牛券Cow Coupons

    嘟嘟嘟 这其实是一道贪心题,而不是dp. 首先我们贪心的取有优惠券中价值最小的,并把这些东西都放在优先队列里,然后看[k + 1, n]中,有些东西使用了优惠券减的价钱是否比[1, k]中用了优惠券的 ...