当前位置: 代码迷 >> 综合 >> java基础复习-线程
  详细解决方案

java基础复习-线程

热度:20   发布时间:2023-09-23 11:40:47.0
-----------------线程优先级设置方法类:public class ThreadPriority extends Thread {       //extends Threadpublic void run() {for (int x = 0; x < 100; x++) {//getName()在接口thred中,如果是其他接口,用Thred.currentThread().getName()实现System.out.println(getName() + ":" + x);  【------休眠----// Thread.sleep(1000); //这么写就是休眠,执行一次休眠一秒出现异常用try catch解决】【//  Thread.yield();  //线程礼让,在一定程度上一人一次来。】}}
}线程代码:public class ThreadPriorityDemo {public static void main(String[] args) {ThreadPriority tp1 = new ThreadPriority();ThreadPriority tp2 = new ThreadPriority();ThreadPriority tp3 = new ThreadPriority();tp1.setName("东方不败");    //设置线程名字,可不设置tp2.setName("岳不群"); tp3.setName("林平之");//获取默认优先级System.out.println(tp1.getPriority());           //JAVA默认优先级都为5System.out.println(tp2.getPriority());System.out.println(tp3.getPriority());// 设置线程优先级              //代表优先几率,不一定优先,多次实现看效果tp1.setPriority(10000);               //线程优先级 1-10  越高越优先//设置正确的线程优先级tp1.setPriority(10);tp2.setPriority(1);tp1.start();tp2.start(); tp3.start();}
}--------------------------------等待线程终止* public final void join():等待该线程终止。 */public class ThreadJoinDemo {public static void main(String[] args) {ThreadJoin tj1 = new ThreadJoin();ThreadJoin tj2 = new ThreadJoin();ThreadJoin tj3 = new ThreadJoin();tj1.setName("李渊");              tj2.setName("李世民");tj3.setName("李元霸");tj1.start();try {                        //李渊走完了,其他再走tj1.join();} catch (InterruptedException e) {e.printStackTrace();}tj2.start();tj3.start();}
}----------------------守护线程* public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。* 当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。 * * 游戏:坦克大战。*/
public class ThreadDaemonDemo {public static void main(String[] args) {ThreadDaemon td1 = new ThreadDaemon();ThreadDaemon td2 = new ThreadDaemon();td1.setName("关羽");td2.setName("张飞");// 设置守护线程td1.setDaemon(true);td2.setDaemon(true);td1.start();td2.start();Thread.currentThread().setName("刘备");  //刘备运行完,线程运行完当前终止。for (int x = 0; x < 5; x++) {System.out.println(Thread.currentThread().getName() + ":" + x);}}
}-------------------强制终止线程* public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。*/public class ThreadStopDemo {public static void main(String[] args) {ThreadStop ts = new ThreadStop();ts.start();// 你超过三秒不醒过来,我就干死你try {Thread.sleep(3000);// ts.stop();ts.interrupt();} catch (InterruptedException e) {e.printStackTrace();}}
}-----------------------------第二种方式实现多线程    解决单继承问题,比如已经继承父类1.自定义类 MyRunnable接口2.在类里重写run();3.创建MyRunnable的对象4.创建Thread类的对象,并把C步骤的对象作为构造参数传递  
---
package cn.itcast_05;public class MyRunnable implements Runnable {@Overridepublic void run() {for (int x = 0; x < 100; x++) {// 由于实现接口的方式就不能直接使用Thread类的方法了,但是可以间接的使用System.out.println(Thread.currentThread().getName() + ":" + x);}}---- */
public class MyRunnableDemo {public static void main(String[] args) {// 创建MyRunnable类的对象MyRunnable my = new MyRunnable();Thread t1 = new Thread(my, "林青霞");Thread t2 = new Thread(my, "刘意");t1.start();t2.start();}
}
}--------------------线程安全问题方法二使用接口问题安全性高。方法一继承问题容易出现安全问题,比如同一个对象同时被几个进程所使用* 如何解决线程安全问题呢?* * 要想解决问题,就要知道哪些原因会导致出问题:(而且这些原因也是以后我们判断一个程序是否会有线程安全问题的标准)* A:是否是多线程环境* B:是否有共享数据* C:是否有多条语句操作共享数据-------------------     解决问题的方法同步代码块:* 		synchronized(对象){* 			需要同步的代码;* 		}* 		注意:* 			同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。* 			多个线程必须是同一把锁。*/所以在run()方法外创建一统一对象,然后把代码块包起来,例如:public class SellTicket implements Runnable {// 定义100张票private int tickets = 100;//创建锁对象private Object obj = new Object();//	@Override
//	public void run() {
//		while (true) {
//			synchronized(new Object()){
//				if (tickets > 0) {
//					try {
//						Thread.sleep(100); 
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
//					System.out.println(Thread.currentThread().getName() + "正在出售第"
//							+ (tickets--) + "张票");
//				}
//			}
//		}
//	}@Overridepublic void run() {while (true) {synchronized (obj) {if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+ "正在出售第" + (tickets--) + "张票");}}}}
}------------------------死锁问题问题:虽然数据安全了,但是呢,一次一大片不好看,我就想依次的一次一个输出。* 如何实现呢?* 		通过Java提供的等待唤醒机制解决。* * 等待唤醒:* 		Object类中提供了三个方法:* 			wait():等待* 			notify():唤醒单个线程* 			notifyAll():唤醒所有线程* 		为什么这些方法不定义在Thread类中呢?* 			这些方法的调用必须通过锁对象调用,而我们刚才使用的锁对象是任意锁对象。* 			所以,这些方法必须定义在Object类中。在数据源添加判断      分别在两个线程添加锁,判断数据源真假,真的时候一个休息,另一个跑,跑完修改判断,唤醒另一个线程。    如此重复主要代码:   线程1if(!s.flag){try {s.wait(); } catch (InterruptedException e) {e.printStackTrace();}}System.out.println(s.name + "---" + s.age);s.flag = false;s.notify(); }}线程2if(s.flag){try {s.wait(); //t1等着,释放锁} catch (InterruptedException e) {e.printStackTrace();}}if (x % 2 == 0) {s.name = "林青霞";s.age = 27;} else {s.name = "刘意";s.age = 30;}x++;s.flag = true;s.notify(); -----------------------线程组ThreadGroup tg = new ThreadGroup("这是一个新的组");MyRunnable my = new MyRunnable();//定义线程到组里去,然后可以通过线程组统一调控Thread t1 = new Thread(tg, my, "林青霞");Thread t2 = new Thread(tg, my, "刘意");-----------------线程池// 创建一个线程池对象,控制要创建2个线程对象。ExecutorService pool = Executors.newFixedThreadPool(2); // 可以执行Runnable对象或者Callable对象代表的线程pool.submit(new MyRunnable());pool.submit(new MyRunnable());//结束线程池pool.shutdown();    -------------------定时器* Timer:定时* 		public Timer()* 		public void schedule(TimerTask task,long delay)* 		public void schedule(TimerTask task,long delay,long period)* 		public void cancel()* TimerTask:任务*/
public class TimerDemo {public static void main(String[] args) {// 创建定时器对象Timer t = new Timer();// 3秒后执 行爆炸任务// t.schedule(new MyTask(), 3000);//附带结束任务t.schedule(new MyTask(t), 3000);}
}class MyTask extends TimerTask {private Timer t;public MyTask(){}public MyTask(Timer t){this.t = t;}public void run() {System.out.println("beng,爆炸了");t.cancel();}--------------------打开程序   runtimeRuntime r =Runtime.getRuntime();r.exec(“notepad”);  //打开记事本