`
Luob.
  • 浏览: 1584401 次
  • 来自: 上海
社区版块
存档分类
最新评论

java之12天 多线程 ( 二)

    博客分类:
  • Java
阅读更多
线程停止 
stop()
interrupt()


/**
 * 停止线程 
 *stop方法已经过时 
 *interrupt()  强制
 *
 * 如果停止线程?
 * 只有一种方法,run方法结束
 * 开启多个线程运行,运行代码通常是循环结构
 * 
 * 只要控制住循环,就可以让run方法结束,也就是线程结束.
 * 
 * 特殊情况
 * 当线程处于冻结状态
 * 就不会读取到标记. 那么线程就不会结束
 * 
 * 
 * 当没有指定的方法让冻结的线程恢复到运行的状态时, 这是需要对冻结的线程进行清除,
 * 强制让线程回复到运行状态来,这样就可以操作标记让线程结束.  
 *  interrupt() 会强制唤醒冻结的线程 然后,但是 这种做法是非法的 ,所以就会抛出异常.
 *
 */

class StopThread implements Runnable{
	private boolean flag=true;
	public synchronized void run(){  //需要 run方法运行完  加入  synchronized 和 wait 后 即使 改变 flag 也终止不了线程运行 .这是采用强制 来中断 
		while(flag){
			try {
				wait();   //即使 改变 状态   线程还是没有停止 
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
				System.out.println(Thread.currentThread().getName()+"......Exception");
				flag=false;
			}
			System.out.println(Thread.currentThread().getName()+"......run");
		}
	}
	
	public void changeFlag(){
		flag=false;
	}
}

public class ThreadStopDemo {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StopThread st=new StopThread();
		Thread t1=new Thread(st);
		Thread t2=new Thread(st);
		t1.start();
		t2.start();
		
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		int num=0;
		while(true){
			if(num++ ==60){
				//st.changeFlag();
				t1.interrupt();
				t2.interrupt();
				break;
			}
			System.out.println(Thread.currentThread().getName()+"...."+num);
		}
	}

}



线程守护 或者 说后台运行
setDaemon(boolean flag)

/**
 * 守护线程
 * setDaemon(boolean flag) ; 用户线程 或者 后台线程  
 * 当所有的前台线程运行完后,后台线程自动关闭
 *
 */
class StopThread implements Runnable{
	private boolean flag=true;
	public synchronized void run(){  //需要 run方法运行完  加入  synchronized 和 wait 后 即使 改变 flag 也终止不了线程运行 .这是采用强制 来中断 
		while(flag){
			/*try {
				//wait();   //即使 改变 状态   线程还是没有停止 
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
				System.out.println(Thread.currentThread().getName()+"......Exception");
				flag=false;
			}*/
			System.out.println(Thread.currentThread().getName()+"......run");
		}
	}
	
	public void changeFlag(){
		flag=false;
	}
}

public class ThreadDaemonDemo {

	public static void main(String[] args) {
		
		StopThread st=new StopThread();
		Thread t1=new Thread(st);
		Thread t2=new Thread(st);
		
		t1.setDaemon(true);  //在运行前将 线程标记为后台线程 让它自动 和主线程 争取 CPU 资源
		t2.setDaemon(true);   //加了 守护线程后  ,上面的 wait  下面的 changeFlag() interrupt() 都可以不用了
		
		t1.start();
		t2.start();
		
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		int num=0;
		while(true){
			if(num++ ==60){
				//st.changeFlag();
				//t1.interrupt();
				//t2.interrupt();
				break;
			}
			System.out.println(Thread.currentThread().getName()+"...."+num);
		}
		
		//当主线程 运行完后, 后台线程 自动停止运行.
	}

}

线程临时加入 join()

/**
 * join 
 * 当A线程 执行到 B的线程的join()方法时,A就会等待 ,等 B线程都执行完后,A才会执行.
 * 
 * join: 可以用来临时加入其他线程执行.
 *
 */
class Demo implements Runnable{
	
	public void run(){
		
		for(int x=0;x<70;x++){
			System.out.println(Thread.currentThread().getName()+"....");
		}
		
	}
}

public class ThreadJoinDemo {

	
	public static void main(String[] args) throws InterruptedException {
		Demo d=new Demo();
		Thread t1=new Thread(d);
		Thread t2=new Thread(d);
		t1.start();
		// t1要申请到 运行中过来, t1 表示要抢夺 CPU的执行权, 此时 主线程 就处于 冻结状态.
		// 只有在 t1 运行结束 后 ,主线程 才能 执行 .
		//t1.join();  
		
		t2.start();
		
		t1.join();  // 如果在 加入到这里后   线程中只有 t1  t2 进行交互,  谁的join 主线程就等谁 完后 就只有 t2 和 主线程抢夺CPU资源
		for (int i = 0; i < 80; i++) {
			System.out.println("main...."+i);
		}
		System.out.println("over");
		
	}

}



线程优先级 和 暂停
setPriority(int newPriority)
yield()


/**
 * setPriority(int newPriority);  //更线程的优先级 ,只有 10 个级别 , 默认为 5
 * 
 * yield(); 暂停现在 执行的线程对象 ,释放执行权, 执行其他线程对象.
 * 
 * 
 *
 */
class Demo implements Runnable{
	
	public void run(){
		
		for(int x=0;x<70;x++){
			System.out.println(Thread.currentThread().getName()+"....");
			Thread.yield(); //释放执行权  临时停止  /稍微减少 线程执行的频率 ,让交替次数多点. 尽量达到 和谐状态.
		}
		
	}
}


public class ThreadYieldDemo {
	public static void main(String[] args) {
		Demo d=new Demo();
		Thread t1=new Thread(d);
		Thread t2=new Thread(d);
		t1.start();
		// t1要申请到 运行中过来, t1 表示要抢夺 CPU的执行权, 此时 主线程 就处于 冻结状态.
		// 只有在 t1 运行结束 后 ,主线程 才能 执行 .
		//t1.join();  
		t2.start();
		t2.setPriority(Thread.MAX_PRIORITY);  //t1.setPriority(6); 也可以 设置优先级
		//t1.join();  // 如果在 加入到这里后   线程中只有 t1  t2 进行交互,  谁的join 主线程就等谁 完后 就只有 t2 和 主线程抢夺CPU资源
		for (int i = 0; i < 80; i++) {
			System.out.println("main...."+i);
		}
		System.out.println("over");

	}

}


常见 多线程应用 简单实例
public class ThreadDemo {
	public static void main(String[] args) {
		//三个不相关的代码快  这样运行效率滴 如果次数再多点的话就更低了
		new Thread(){
			public void run(){
			for (int i = 0; i < 100; i++) {
				System.out.println("A");
			}}
		}.start();
		
		
		for (int i = 0; i < 100; i++) {
			System.out.println("B");
		}
		
		new Thread(
			new  Runnable(){
				public void run(){
					for (int i = 0; i < 100; i++) {
						System.out.println("C");
					}
					
				}
			}
		).start();
		
		//这样 三个线程就可以同时运行了 
		
		//或则建立类型  
       new Thread(new ThreadTest()).start();
       
	}

}
class ThreadTest implements Runnable{
	
	public void run(){
		for (int i = 0; i < 100; i++) {
			System.out.println("C");
		}
		
	}
}
//这种情况下使用多线程  会提高运行效率
分享到:
评论

相关推荐

    JAVA12天全掌握

    【JAVA12天全掌握】课程旨在帮助学员在12天内系统地理解和掌握Java编程语言的核心概念和技术。这不仅是一场快速学习的挑战,也是一个深度理解Java编程基础的全面之旅。通过本课程,学员将从零开始,逐步建立起扎实的...

    初学者必看多线程倒计时器

    本文介绍了如何使用Java Swing GUI框架、多线程以及日期时间处理技术来实现一个简单的多线程倒计时器。通过这个例子,读者可以了解到如何在Java中构建GUI应用程序,如何利用多线程来实现后台任务的并发执行,以及...

    java教程-每日一课,27天java从入门到进阶

    第12天:字符串王者地位 第13天:算法工具类包装类 第14天:正则及其他类 第15-18天:数组到集合 第19天:文件操作IO 第20、21天:IO流文件操作类图 第22天:其他流 第23天:多线程 第24天:多线程深入 第25天:GUI ...

    java视频教程_黑马Java零基础辅导班[第二期]12天课件源码

    本教程是针对零基础学习者的黑马Java辅导班第二期内容,涵盖了12天的课程精华,旨在帮助初学者快速掌握Java语言的基础知识。 【Java视频教程】 Java视频教程是学习Java的有效途径,它通过直观的视觉演示,让学习者...

    java100天速成

    6. **多线程**:Java对多线程的支持非常强大,你需要学习如何创建和管理线程,理解同步与互斥,以及线程池的概念,这对提升程序性能有很大帮助。 7. **网络编程**:Java的Socket编程能让你构建网络应用程序,理解...

    韩顺平30天学java

    12. **反射**:通过反射机制,可以在运行时动态地获取类的信息并操作对象,这是Java高级特性之一。 13. **泛型**:泛型提供了一种在编译时检查类型安全的方法,同时允许程序员编写更灵活的代码。 14. **Java API的...

    21天学好JAVA

    7. **多线程编程**:了解线程的概念,学习Thread类和Runnable接口,掌握同步和异步操作,以及线程间的通信。 8. **JAVA Swing和JavaFX**:学习如何使用JAVA创建图形用户界面(GUI),掌握Swing组件库的使用,或者更...

    21天学通java的源代码

    6. 多线程:Java内置了对多线程的支持,使得开发并发应用变得相对简单。 7. 安全性:Java有严格的安全模型,防止恶意代码对系统造成损害。 在《21天学通Java》这本书中,读者可以接触到以下核心知识点: 1. Java...

    21天精通java源代码

    6. **多线程**:Java提供了对多线程的支持,理解线程的创建、同步和通信,可以实现高效的并发处理。 7. **反射机制**:反射是Java的一大特色,它允许在运行时检查类、接口、字段和方法的信息,甚至动态调用方法。 ...

    27天成为Java大神

    6. **多线程**:Java内置了对多线程的支持,包括Thread类、Runnable接口,以及同步控制方法(如synchronized关键字、wait()、notify()和notifyAll())。 7. **反射API**:Java反射机制允许在运行时动态地获取类的...

    java基础18天Typora笔记

    多线程编程是Java的一个重要特性,通过实现Runnable接口或继承Thread类创建线程。了解并发控制(synchronized关键字、wait/notify机制)、线程状态以及线程池的概念。 9. **文件与文件系统** 学习File类用于文件...

    21天学会java光盘电子教案(PPT).

    9. **多线程**:Java内置了对多线程的支持,你可以通过实现Runnable接口或继承Thread类来创建线程。 10. **Swing和JavaFX**:对于图形用户界面(GUI)开发,Java提供了Swing和JavaFX库。这两个库包含了各种组件和...

    21天学java源代码

    9. **多线程**:Java内置了对多线程的支持,学习者需要理解线程的创建、同步、生命周期管理等概念。 10. **文件和目录操作**:Java提供了File类来处理文件和目录,包括创建、删除、重命名等操作。 11. **Swing和...

    21天学通Java.第7版-中文版-良心积分价

    10. **多线程**:Java内置了对多线程的支持,通过实现Runnable接口或继承Thread类来创建线程。了解线程的同步和通信机制,如synchronized关键字、wait()、notify()和notifyAll()方法。 11. **文件和目录操作**:...

    Java35天详细讲义

    11. **多线程**:讲解线程的创建和管理,同步机制(如synchronized关键字和wait/notify机制)以及线程池的使用。 12. **接口与抽象类**:对比接口和抽象类,理解它们在设计中的作用。 13. **反射与注解**:介绍...

    java视频教程_黑马Java零基础辅导班[第二期]08天课件源码

    11. **多线程**:Java内置了对多线程的支持,通过Thread类或实现Runnable接口创建并管理线程,理解同步和互斥的概念,能够编写并发程序。 12. **异常与日志**:在实际开发中,良好的异常处理和日志记录能帮助定位和...

    21天自学速成 Java 语言 电子书

    11. **多线程**:学习如何创建和管理线程,同步机制(synchronized关键字、wait()、notify()、notifyAll()),以及线程池的使用。 12. **网络编程**:了解套接字(Socket)编程,包括TCP和UDP通信。 13. **Java...

    Java2 编程21天自学通

    11. **多线程**:掌握线程的创建与同步,包括Thread类、Runnable接口,以及synchronized关键字、wait()和notify()方法。 12. **IO流和NIO**:了解Java的IO流体系,以及New IO (NIO) 提供的非阻塞I/O操作。 13. **...

    Java 21天学通java

    9. **多线程**:Java支持多线程编程,通过Thread类和Runnable接口可以创建并管理多个执行线程,提高程序的并发性能。 10. **Java Swing和JavaFX**:这两是Java的图形用户界面(GUI)库,用于构建桌面应用程序。...

    java速成100天

    6. **多线程**:Java支持多线程编程,了解Thread类和Runnable接口,以及同步机制(synchronized关键字、wait()、notify()和notifyAll()方法)的应用。 7. **反射机制**:深入理解Java反射机制,可以动态地获取类的...

Global site tag (gtag.js) - Google Analytics