`
yedaya
  • 浏览: 21300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 多线程学习

阅读更多

最近学习了一下java的多线程,有些许收获,综合记录下来,旨在通过学习和修改简单的小例子了解一个特定的概念。

关于SwingUtilities.invokeLater 和 invokeAndWait方法,

原来使用invokeLater总是以为新开了一个线程,查看了相关资料才发现我错了,这两个方法都是将要执行的代码(run方法内)放到事件分发队列中等待时机运行,具体分析见代码注释。

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
/**
 * invokeLater()方法和invokeAndWait()方法区别:
 * later 方法会在未来某个时间点上异步运行,不知道其何时才会真正的运行
 * wait  方法是同步的,它会等到目标完成执行动作后才返回。其不可再事件派发Thread所调用,
 * 		   如果thread在事件派发thread运行目标前被中断,则抛出异常。
 * 一般法则:使用wait方法读取Swing组件的值或确保继续运行程序之前某些事物应该显示在屏幕上。
 * */
public class SwingUtilitiesTest extends JFrame{
	JButton testButton = null;
	public SwingUtilitiesTest(){
		init();
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new SwingUtilitiesTest();

	}
	public void init(){
		this.setSize(new Dimension(300,300));
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		testButton = new JButton("test");
		testButton.addActionListener(new TestAction());
		this.add(testButton);
		this.setVisible(true);
	}
	
	/**
	 * update text at Event Dispatch Thread
	 * */
	public void setButtonText(final String text){
		SwingUtilities.invokeLater(new Runnable(){
			public void run(){
				testButton.setText(text);
			}
		});
	}
	int i=0;
	class TestAction implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			setButtonText("before sleep");
			System.out.println("before");
			Thread t = new Thread(){
				@Override
				public void run(){
					try {
						System.out.println("before t");
						Thread.sleep(5000);//operate which can take a long time
						setButtonText("after thread sleep"+i++);
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}	
				}
			};
			t.start();
			setButtonText("after test"+i++);
			
			
		}
		
	}

}

 有关同步,wait 和 notify,

public class WaitTest {
	int share = 0;
	Object lock = new Object();
	boolean canBRun = false;
	ThreadA a = null;
	ThreadB b = null;
	public WaitTest() {
		a = new ThreadA();
		b = new ThreadB();
		b.start();
		a.start();
		
		
	}
	
	public static void main(String[] args) {
		new WaitTest();
	}

	class ThreadA extends Thread {
		@Override
		public void run() {
			synchronized(lock){
				for (int i = 0; i < 5; i++) {
					share++;
					System.out.println("A thread share : " + share);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}				
				canBRun = true;	
				lock.notify();
			}
		}
	}

	class ThreadB extends Thread {
		@Override
		public void run() {
			synchronized(lock){
				while(true){
					if(canBRun){
						for (int i = 0; i < 5; i++) {
							share++;
							System.out.println("B thread share : " + share);
						}
						break;
					}else{
						try {
							System.out.println("B wait");
							lock.wait();//wait can free lock
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
							break;
						} 
					}
				}
				
				
			}
		}
	}
}

 

有关join方法

public class JoinTest {
	volatile int share = 0;
	ThreadA a;
	ThreadB b;
	public JoinTest(){
		a = new ThreadA();
		b = new ThreadB();
		a.start();
		b.start();
	}
	public static void main(String[] args) {
		new JoinTest();		
	}
	
	class ThreadA extends Thread{
		@Override
		public void run(){
			
			for(int i = 0; i<5; i++){
				share++;				
				System.out.println("A thread share : "+share);
				try {				
					System.out.println("before b join ,thread a,b is uncontrollable");
					if(b.isAlive()){
						b.join();// if b join b must run until to the end then a can continue 
						System.out.println("after b join");
					}					
					
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	class ThreadB extends Thread{
		@Override
		public void run(){
				for(int i = 0; i<5; i++){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					share++;
					System.out.println("B thread share : "+share);
				}
		}
	}
}

 Executors

public class ExecutorsTest1 {
	volatile int share = 0;
	ThreadA a;
	ThreadB b;
	public ExecutorsTest1(){
//		//创建一个可重用固定线程数的线程池 
//        ExecutorService pool = Executors.newFixedThreadPool(3); 
        
//        //创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。 
//        ExecutorService pool = Executors.newCachedThreadPool(); 
        
      //创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。 
        ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();


		a = new ThreadA();
		b = new ThreadB();
		
		pool.execute(a);
		pool.execute(b);
		
		pool.shutdown();
		
//		a.start();
//		b.start();
	}
	public static void main(String[] args) {
		new ExecutorsTest1();		
	}
	
	class ThreadA extends Thread{
		@Override
		public void run(){
			
			for(int i = 0; i<5; i++){
				share++;				
				System.out.println("A thread share : "+share);
				
			}
		}
	}
	
	class ThreadB extends Thread{
		@Override
		public void run(){
				for(int i = 0; i<5; i++){
					
					share++;
					System.out.println("B thread share : "+share);
				}
		}
	}
}

  

分享到:
评论

相关推荐

    java多线程学习

    在学习Java多线程的过程中,理解线程与进程的概念是非常基础且重要的一步。首先,进程是一个程序的执行实例,是操作系统资源分配的基本单位,具有独立的地址空间和运行状态。每个进程至少包含一个线程,我们称之为...

    java多线程学习资料

    ### Java多线程学习资料知识点解析 #### 一、引言 Java作为一种广泛使用的编程语言,在并发编程领域具有独特的优势。多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨...

    Java多线程学习Java多线程学习Java多线程学习Java多线程学习.txt

    Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java...

    java多线程学习-ftp上传

    Java多线程学习是编程领域中的重要一环,特别是在服务器端和网络编程中,多线程技术能够有效地利用系统资源,提高程序的并发性。FTP(File Transfer Protocol)上传则是通过网络将本地文件传输到远程服务器的过程。...

    JAVA多线程学习内容

    总的来说,Java多线程学习涵盖了线程的创建、同步、通信、调度以及异常处理等多个方面,深入理解和掌握这些知识点对于提升Java程序的性能和复杂性至关重要。通过阅读提供的"Java多线程.pdf"文档,你可以进一步了解和...

    java多线程学习视频

    Java多线程是一块重要的内容,李兴华讲解的Java是一个很好的资源

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

    Java 多线程学习总结归纳(附代码)

    下面是对Java多线程学习的详细解析。 1. **多线程概述**: 多线程是指一个程序内可以同时执行多个独立的执行流,每个执行流被称为一个线程。Java通过Thread类来代表线程,每个线程都有自己的生命周期,包括新建、...

    java多线程学习java多线程学习.docx

    总的来说,Java多线程学习涵盖了线程的创建与管理、并发工具的使用、以及高级并发编程策略。理解并掌握这些知识,能够帮助开发者编写出高效、可靠的多线程应用。而Doug Lea的工作不仅推动了Java并发技术的发展,也为...

    Java 多线程学习总结6

    在“Java多线程学习总结6”这个主题中,我们可以深入探讨Java多线程的实现、管理及优化。下面将详细阐述相关知识点。 1. **线程的创建方式** - **继承Thread类**:自定义类继承Thread类,并重写run()方法,创建...

    java多线程学习教程

    ### Java多线程学习教程知识点详解 #### 一、Java多线程简介 Java多线程编程是指在Java应用程序中利用多线程技术提高程序的并发性和效率。相比于C或C++等语言,Java提供了更加高级的语言级支持,使得开发者能够...

    Java 多线程学习详细总结

    【Java 多线程学习详细总结】 在Java编程中,多线程是处理并发执行任务的关键技术。本文将深入探讨Java中的多线程概念、实现方式、线程状态转换、线程调度、线程同步以及数据传递等相关知识。 1. **扩展`java.lang...

    Java多线程学习-动力节点共22页.pdf.zip

    本资料“Java多线程学习-动力节点共22页.pdf.zip”提供了对Java多线程的深入学习,旨在帮助开发者掌握这一关键技术。 1. **线程基础**:Java中的线程是通过`Thread`类或者实现`Runnable`接口来创建的。通过继承`...

    java多线程学习探讨

    Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个...PPT文件"Ch17 多线程.ppt"可能会包含更详细的讲解,包括线程安全的数据结构、并发集合、线程间的通信机制等内容,这些都是Java多线程学习的重要部分。

    Java多线程学习笔记

    ### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...

    Java多线程学习基础原理

    Java多线程学习基础原理主要涉及以下几个方面: 1. 线程的创建和启动 Java提供了两种创建线程的方式:继承Thread类和实现Runnable接口。当创建一个Thread类的子类对象并调用start()方法时,会启动一个新的线程,并...

Global site tag (gtag.js) - Google Analytics