`

java线程(笔试用)

 
阅读更多
  • 启动线程两种方式

继承Thread类

new Thread() {
    public void run() {

    }
}.start();

实现Runnable接口

new Thread(new Runnable() {
    public void run() {

    }
}).start();

 

  • 线程互斥

多个线程操作同一个资源(即某个对象),为保证线程在对资源的状态(即对象的成员变量)进行一些非原子性操作后,状态仍然是正确的。

两种方法解决:

加入互斥代码块synchronized (lock){}

方法前加synchronized关键字

 

  • 线程同步

使用wait、notifynotifyAll方法实现

要用到共同数据(包括同步锁)或相同算法的多个方法要封装在一个类中
锁是上在代表要操作的资源类的内部方法中的,而不是上在线程代码中的。这样写出来的类就是天然同步的,只要使用的是同一个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笔试题大全

    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,15个Java线程并发面试题和答案.docx

    java笔试题大集合及答案(另附各大公司笔试题)

    60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法 反对使用...

    java面试笔试题大集合及答案(附各大公司)

    java面试笔试题大集合及答案(java求职笔试大全、ejb方面、java基础方面知识、java编程题及其代码、java线程编程方面知识、应聘Java笔试时可能出现问题及其答案)

    java笔试题大汇总

    最常用java笔试题,n多年都在用. 1、面向对象的特征有哪些方面 1.抽象: 2.继承: 3.封装: 4. 多态性: 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short...

    java基础面试笔试题及其答案

     D、多线程机制  2.下列叙述中,正确的是____。  A、Java语言的标识符是区分大小写的  B、源文件名与public类名可以不相同  C、源文件名其扩展名为.jar  D、源文件中public类的数目不限  3.下列属于合法的Java...

    JAVA笔试题目集合

    目前最全的JAVA笔试题目集合 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法...

    Java程序员笔试题汇编

    应聘Java程序员参考资料。共149题,含参考答案。主要包括以下几方面的试题:Java基础、多线程、JSP、Servlet、JDBC、XML、EJB、服务器、MVC、JavaEE、设计模式、Linux、代码改错等。

    Java工程师线程试题

    Java工程师培训试题;线程部分的多选题、单选题、判断题。技能证书考试过关题。

    java面试笔试题大汇总

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

    java多线程笔试题-APK-Multi-Tool:脚本主体

    java多线程笔试题APK 多工具 我已经更新了所有文件并修改了 Apk 管理器的脚本以修复许多用户报告的来自 Daneshm90 apk 管理器的错误,他编写了一个简单的脚本来简化编辑 apk 的过程。 有很多下载所以认为它的需求 ...

    JAVA笔试面试资料JDBC HTTP、JSP、Servlet、Struts面试题汇总资料.zip

    2014年最新Java笔试题及答案.docx 225道Java面试题 学会了Java面试随你问.docx Ant和Maven的作用是什么?两者之间功能、特点有哪些区别?.docx Java初级程序员面试必备的基础知识总结.docx Java基础、Java集合、多...

    java笔试题大集合及答案(另附各大公司笔试题).rar

    java笔试题大集合及答案,包含java基础、线程编程方面、Servlet方面、Jsp方面、Jdbc、Jdo方面

    java笔试题大集合及答案.zip

    包括: 1. EJB方面 2.Java基础方面 3.代码与编程题 4.求职笔试大全 5.线程编程方面 6.应聘Java笔试时可能出现问题及其答案

    JAVA笔试总结 -- 非常全面

    JAVA笔试总结 非常全面 基本上囊括了Java所有常考知识点,并且每个知识点都有详细解释。 知识点主要包括: native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,...

    java笔试题大集合及答案

    Java基础方面.doc 代码与编程题.doc 求职笔试大全.pdf 线程编程方面.doc 应聘Java笔试时可能出现问题及其答案.doc 等等

    java笔试面试大全-附答案

    Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM

    java笔试汇总 经典中的经典!绝对超值!还等什么 下载评分吧!!!

    java笔试汇总 经典中的经典!绝对超值!还等什么 下载评分吧!!! 例如:1、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 public class ThreadTest1{ private int j; public ...

Global site tag (gtag.js) - Google Analytics