Java多线程基础概念
进程跟线程的区别
- 进程process是操做系统中运行的一个任务,占有必定的内存资源;线程thread是进程中包含的一个或多个执行单元,归属于进程
多线程的应用场景
- 一个程序须要同时完成多个任务时
- 多个线程效率更高的状况下,好比下载
并发原理
- 对于单核cpu来讲,多线程并非同时进行的,操做系统将时间分红了多个时间片,大概均匀的分配给线程,到达某个线程的时间段,该线程运行,其他时间待命,这样从微观上看,一个线程是走走停停的,宏观感官上,在某一时刻彷佛全部线程都在运行。并发是针对时间片断来讲的,在某个时间段内多个线程处于runnable到running之间,但每一个时刻只有一个线程在running,这叫作并发。
建立线程
- 继承Thread类,重写run方法
- 定义线程体Runnable run1,实现Runnable接口,Thread t = new Thread(run1);
- 继承Thread建立线程相对于实现Runnable接口来建立,有两点坏处,一是将线程与任务造成了强耦合关系,破坏了线程的复用性,二是java中的类只能继承一个父类,继承Thread阻断了其它的继承关系,而一个类能够实现多个接口,很灵活
- thread的start方法,用于将线程归入到线程调度 ,线程进入runnable状态
- 可使用匿名内部类的方式建立线程
java中线程的几个经常使用api
- Thread.currentThread(); //获取当前线程,返回Thread
- Thread.getId(); //获取线程id,返回long
- Thread.getName(); //获取线程名字,返回String
- Thread.getPriority(); //获取线程优先级,返回int,提供了三个常量(MIN_PRIORITY、MAX_PRIORITY、NORM_PRIORITY)
- Thread.getState(); //获取线程状态
- Thread.isAlive(); //获取线程是否活动
- Thread.isDaemon(); //返回是不是守护线程
- Thread.isInterrupted(); //返回是否中断
- static Thread.interrupted();//返回是否中断,并重置中断状态为false
- Thread.sleep(ms); //使线程进入休眠,sleepblock,休眠结束回到Runnable
- static Thread.yield(); //static方法,让出时间片并回到Runnable
- Thread.join(); //好比在线程b的方法中加入a.join,表明等待线程a执行完毕,再执行b
守护线程
- setDaemon(boolean b); //须要在start方法调用前进行设置
- 当线程只剩下守护线程时,全部守护线程终止
- 好比GC
synchronized
- 多个线程并发读写同一个临界资源,会引起线程并发安全问题
** 临界资源:多线程共享实例变量;多线程共享静态资源变量
** 解决办法:异步变同步
- 同步与异步
** 有前后顺序的运行方式是同步
** 没有前后顺序,由线程调度随机分配时间片断运行,是异步
- synchronized是java中的同步锁
- synchronized能够修饰某个方法,使访问这个方法的线程同步
- synchronized(object){代码块}; //object必须是同一对象,锁才有效用
** 若是synchronized在一个非静态方法中,一般锁对象是this
** synchronized也能够直接修饰代码块
wait¬ify
- 多线程之间协调工做
- 条件不知足,等待wait,条件知足notify,等待唤醒
- 若是想在一个线程上等待,在另外一个线程上notify,那么须要给这两个方法加锁
** synchronized(obj){obj.wait();}
** synchronized(obj){obj.notify();}
- 若是多个线程在一个线程上等待,notify()只能唤醒一个,notifyAll()能够唤醒全部
线程安全API与非线程安全API
- StringBuffer 同步的,线程安全,synchronized append()]
- StringBuilder 不一样步的,线程不安全的,append()
- Vector Hashtable ConcurrentHashMap同步,线程安全
- ArrayList HashMap 不一样步,线程不安全
- Collections.synchronizedList(list) 获取线程安全的list集合
- Collections.synchronizedSet(set) 获取线程安全的set集合
- Collections.synchronizedMap(map) 获取线程安全的map
线程池
- 重用与限制数量
- 线程池的使用与ExecutorService实现:另开一章
欢迎关注本站公众号,获取更多信息