java---Thread多线程(上)

public class Demo {

public static void main(String[] args) {

	// =====================Thread多线程===================================
	//
	/**
	 * 多线程实现方法1 1、创建一个类,继承Thread类,重写run()方法, 2、实现这个类,调用start()方法启动一个线程
	 */
	MyThread mt = new MyThread();
	mt.start();

	/**
	 * 多线程实现方法2 1、声明实现Runnable接口类,并重写run()方法 2、在创建Thread作为一个参数传递,并启动线程
	 */
	Mythread2 mt2 = new Mythread2();
	Thread t = new Thread(mt2);
	t.start();

	/**
	 * 两种方法的区别 继承Thread:由于子类重写了Thread类的run()方法,当调用start()时直接找子类的run()方法
	 * 实现Runnable:构造函数中传入了Runnable的引用,成员变量记住了它,start()调用run()方法时内部判断
	 * 成员变量Runnable的引用是否为空,不为空编译时看的Runnable的run()方法,运行时执行的 是子类的run()方法
	 */

	/**
	 * 优缺点 继承Thread: 优点:可以直接使用Thread类的run(),当调用start()时,直接找子类的run()方法
	 * 缺点:如果已经有了继承父类,就不能实现这种方法 实现Runnable:
	 * 优点:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口可以多实现
	 * 缺点:不能直接使用Thread中的方法,需要先获取到线程对象后,才能得到Thread的方法,代码复杂
	 */

	/**
	 * 匿名内部类实现线程的两种方式 1 * 继承Thread类
	 */
	new Thread() {
		public void run() {
			// TODO Auto-generated method stub
		};
	}.start();

	/**
	 * 匿名内部类实现线程的两种方式 2 * 实现Runnable接口
	 */
	new Thread(new Runnable() {
		@Override
		public void run() {
			// TODO Auto-generated method stub
		}
	}).start();

	/**
	 * 获取名字 * getName()方法
	 */
	String nameString = t.getName();

	/**
	 * 设置名字 *通过构造函数可以传入String类型的名字
	 */
	new Thread("name") {
		public void run() {
		};
	}.start();
	/**
	 * 设置名字 *通过setName(String str);方法设置线程对象的名字
	 */
	Thread t2 = new Thread() {
		public void run() {
		};
	};
	t2.setName("name");
	t2.start();

	/**
	 * 获取当前线程对象 *Thread.currentThread(),主线程也可以获取
	 */
	Thread.currentThread().getName();

	/**
	 * 休眠线程 *Thread.sleep(毫秒,纳秒)
	 */
	Thread.sleep(1000);

	/**
	 * 守护进程 *etDaemon();
	 */
	t2.setDaemon(true);

	/**
	 * 多线程加入 *join(); join(int);加入固定时间,过了固定时间则继续交替执行
	 */
	final Thread t1 = new Thread() {
		@Override
		public void run() {
			for (int i = 0; i < 10; i++) {
				System.out.println(getName() + "aaa");
			}
		}
	};

	Thread t3 = new Thread() {
		@Override
		public void run() {
			for (int i = 0; i < 10; i++) {
				if (i == 2) {
					t1.join();// 匿名内部类在使用所在方法中的成员变量时,成员变量必须使用final修饰
				}
				System.out.println(getName() + "bb");
			}
		}
	};

	/**
	 * 礼让线程 *Thread.yield()让出cpu;
	 */

	/**
	 * 设置线程优先级 *setPriority();
	 */
	t3.setPriority(10);

	/**
	 * 多线程线程安全问题
	 * 继承Thread类
	 * 锁对象用Ticket1.class
	 */
	new Ticket1().start();
	new Ticket1().start();
	new Ticket1().start();
	new Ticket1().start();
	
	/**
	 * 多线程线程安全问题
	 * 实现Runnable接口
	 * 锁对象用Ticket1.class,也可以用this
	 */
	MyTicket3 mt3 = new MyTicket3();
	new Thread(mt3).start();
	new Thread(mt3).start();
	new Thread(mt3).start();
	new Thread(mt3).start();

}

}

class MyTicket3 implements Runnable{
private int ticket2 = 100;
@Override
public void run() {
	while (true) {
		synchronized (MyTicket3.class) {
			if (ticket2 <= 0) {
				break;
			}
			System.out.println(Thread.currentThread().getName() + ":这是第" + ticket2-- + "号票");
		}
	
}

}

class Ticket1 extends Thread {
private static int ticket = 100;

@Override
public void run() {
	while (true) {
		synchronized (Ticket1.class) {
			if (ticket <= 0) {
				break;
			}
			System.out.println(getName() + ":这是第" + ticket-- + "号票");
		}
		

	}
}
}

/**
* 同步方法 *synchronized(){}; 只需要在方法上加synchronized关键字 非静态的同步方法的锁对象是this
 * 静态的同步方法锁对象是该类的字节码对象(Printer2.class)
*/
class Printer2 {
public static synchronized Void print4() {
	synchronized (Printer2.class) {
		// TODO Auto-generated method stub
	}

}

public synchronized void print2() {
	// TODO Auto-generated method stub
}

public void print3() {
	synchronized (this) {
		// TODO Auto-generated method stub
	}

}

}

/**
 * 同步代码块 *synchronized(){}; 采用synchronized关键字再加上一个所对象来定义一段代码段
* 多个同步代码块如果使用相同的所对象,那么它们就是同步的 所对象不能用匿名对象,匿名对象不是同一个对象
 */
class Printer {
Demo d = new Demo();

public void print() {
	synchronized (d) {
		// TODO Auto-generated method stub
	}
}
}

class MyThread extends Thread {
@Override
public void run() {
	// TODO Auto-generated method stub
}
}

class Mythread2 implements Runnable {

@Override
public void run() {
	// TODO Auto-generated method stub

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值