- 启动线程两种方式
继承Thread类
new Thread() { public void run() { } }.start();
实现Runnable接口
new Thread(new Runnable() { public void run() { } }).start();
- 线程互斥
多个线程操作同一个资源(即某个对象),为保证线程在对资源的状态(即对象的成员变量)进行一些非原子性操作后,状态仍然是正确的。
两种方法解决:
加入互斥代码块synchronized (lock){}
方法前加synchronized关键字
- 线程同步
使用wait、notify、notifyAll方法实现
要用到共同数据(包括同步锁)或相同算法的多个方法要封装在一个类中
锁是上在代表要操作的资源类的内部方法中的,而不是上在线程代码中的。这样写出来的类就是天然同步的,只要使用的是同一个new出来的对象,那么这个对象就具有同步互斥特性
判断唤醒等待标记时使用while增加程序健壮性,防止伪唤醒
典型是生产者消费者例子,生产和消费方法交替进行:
public class ProducerConsumer { public static void main(String[] args) { final ProducerConsumer pc = new ProducerConsumer(); for(int i=0;i<5;i++){ new Thread() { public void run() { while(true){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } pc.produce(); } } }.start(); } for(int i=0;i<5;i++){ new Thread() { public void run() { while(true){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } pc.consume(); } } }.start(); } } private boolean flg = true; public synchronized void produce(){ while(!flg){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("produce"); flg = false; this.notify(); } public synchronized void consume(){ while(flg){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("consume"); flg = true; this.notify(); } }
- 多个线程访问共享数据的方式
1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据。
2.如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有如下两种方式来实现这些Runnable对象之间的数据共享:
a.将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象。每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信。
b.将这些Runnable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法。
c.上面两种方式的组合:将共享数据封装在另外一个对象中,每个线程对共享数据的操作方法也分配到那个对象身上去完成,对象作为这个外部类中的成员变量或方法中的局部变量,每个线程的Runnable对象作为外部类中的成员内部类或局部内部类。
总之,要同步互斥的几段代码最好是分别放在几个独立的方法中,这些方法再放在同一个类中,这样比较容易实现它们之间的同步互斥和通信。
-
ThreadLocal
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
相关推荐
Java多线程常见面试题 31 Java企业面试题整理集合(1) 34 Java企业面试题整理集合(2) 43 Java企业面试题整理集合(3) 55 Java企业面试题整理集合(4) 62 Java企业面试题整理集合(5) 74 Java企业面试题整理集合(6) 85 ...
15个Java线程并发面试题和答案.docx,15个Java线程并发面试题和答案.docx 15个Java线程并发面试题和答案.docx,15个Java线程并发面试题和答案.docx
60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法 反对使用...
java面试笔试题大集合及答案(java求职笔试大全、ejb方面、java基础方面知识、java编程题及其代码、java线程编程方面知识、应聘Java笔试时可能出现问题及其答案)
最常用java笔试题,n多年都在用. 1、面向对象的特征有哪些方面 1.抽象: 2.继承: 3.封装: 4. 多态性: 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short...
D、多线程机制 2.下列叙述中,正确的是____。 A、Java语言的标识符是区分大小写的 B、源文件名与public类名可以不相同 C、源文件名其扩展名为.jar D、源文件中public类的数目不限 3.下列属于合法的Java...
目前最全的JAVA笔试题目集合 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法...
应聘Java程序员参考资料。共149题,含参考答案。主要包括以下几方面的试题:Java基础、多线程、JSP、Servlet、JDBC、XML、EJB、服务器、MVC、JavaEE、设计模式、Linux、代码改错等。
Java工程师培训试题;线程部分的多选题、单选题、判断题。技能证书考试过关题。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
java多线程笔试题APK 多工具 我已经更新了所有文件并修改了 Apk 管理器的脚本以修复许多用户报告的来自 Daneshm90 apk 管理器的错误,他编写了一个简单的脚本来简化编辑 apk 的过程。 有很多下载所以认为它的需求 ...
2014年最新Java笔试题及答案.docx 225道Java面试题 学会了Java面试随你问.docx Ant和Maven的作用是什么?两者之间功能、特点有哪些区别?.docx Java初级程序员面试必备的基础知识总结.docx Java基础、Java集合、多...
java笔试题大集合及答案,包含java基础、线程编程方面、Servlet方面、Jsp方面、Jdbc、Jdo方面
包括: 1. EJB方面 2.Java基础方面 3.代码与编程题 4.求职笔试大全 5.线程编程方面 6.应聘Java笔试时可能出现问题及其答案
JAVA笔试总结 非常全面 基本上囊括了Java所有常考知识点,并且每个知识点都有详细解释。 知识点主要包括: native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,...
Java基础方面.doc 代码与编程题.doc 求职笔试大全.pdf 线程编程方面.doc 应聘Java笔试时可能出现问题及其答案.doc 等等
Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM
java笔试汇总 经典中的经典!绝对超值!还等什么 下载评分吧!!! 例如:1、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 public class ThreadTest1{ private int j; public ...