@Senl
2017-03-30T12:40:59.000000Z
字数 4519
阅读 1111
技术学习
启动新的线程步骤
建立Runable对象(线程的任务)
Runnable threadJob = new MyRunnable();
建立Trhead对象(执行工人)并赋值Runnable(任务)
Thread myThread = new Thread(threadJob)
启动Thread
myThread.start();
//实现Runnable接口来建立给thread运行的任务public class MyRunnable implements Runnable {@Overridepublic void run() {//Runnable是抽象类,所以一定要实现其中所有的方法//没有参数,要运行的程序代码放在这里doIt();}public void doIt() {System.out.println("you r in a thread");}}
//线程测试启动器public class ThreadTestDrive {public static void main(String[] args) {Runnable threadJob = new MyRunnable();Thread myTread = new Thread(threadJob);myTread.start();System.out.println("now you r in main");}}
输出结果(可能是):
now you r in mainyou r in a thread
1. 以小写t描述的thread是一个独立的线程
2. Java中每一个线程都有独立的执行空间
3. 大写Thread是java。lang。Thread这个类,它的对象用于表示线程
4. Thread需要任务,通过Runnable的实例
5. 需要将Runnable传给Thread的构造函数才能启动新的线程
6. Java虚拟机的调度器不能保证人和线程的执行时间和顺序,所以期待它会完全地保证平均分配执行。
//(改进后的)实现Runnable接口来建立给thread运行的任务public class MyRunnable implements Runnable {@Overridepublic void run() {//Runnable是抽象类,所以一定要实现其中所有的方法//没有参数,要运行的程序代码放在这里/** 改进的代码*/try{Thread.sleep(2000); //强迫进程离开执行中的状态}catch(InterruptedException ex) {ex.printStackTrace();}/** 以下为执行代码*/doIt();}public void doIt() {System.out.println("you r in a thread");}}
//线程测试启动器public class ThreadTestDrive {public static void main(String[] args) {Runnable threadJob = new MyRunnable();Thread myTread = new Thread(threadJob);myTread.start();System.out.println("now you r in main");}}
输出结果(一定是):
now you r in mainyou r in a thread
//测试 启动和建立两个线程public class ThreadTestDrive implements Runnable {public static void main(String[] args) {//创建出ThreaTestDrive实例ThreadTestDrive runner = new ThreadTestDrive();//创建出两个Thread实例Thread alpha = new Thread(runner);Thread beta = new Thread(runner);//分别对两个线程进行名字修改alpha.setName("Thread Alpha");beta.setName("Thread Beta");//启动两个线程alpha.start();beta.start();}@Overridepublic void run() {for (int i = 0; i < 5; i ++) {//每一个线程运行个五次,显示出当前运行的是哪一个线程String threadName = Thread.currentThread().getName();System.out.println(threadName + "正在执行");}}}
测试结果:
Thread Alpha正在执行Thread Beta正在执行Thread Beta正在执行Thread Beta正在执行Thread Beta正在执行Thread Beta正在执行Thread Alpha正在执行Thread Alpha正在执行Thread Alpha正在执行Thread Alpha正在执行
//两人的银行账号类public class BankAccount {private int balance = 3000; //将存款数设为私有,以保护public int getBalance() { //声明一个公共的方法让两人查询账户存款return balance;}public void withdraw (int amount){ //取出存款的方法balance = balance - amount;}}
//创建两个线程并对银行账户进行取款或者查看的任务public class MoneyRunnable implements Runnable {private BankAccount account = new BankAccount();public static void main(String[] args) {//将MoneyRunnable实例化MoneyRunnable job = new MoneyRunnable();//创建两个线程并对它们分别命名后启动Thread boy = new Thread(job);Thread girl = new Thread(job);boy.setName("BoyFriend");girl.setName("GirlFriend");boy.start();girl.start();}//重写Runnable下的run()方法@Overridepublic void run() {for(int x = 0;x <10; x++) {makeWithdrawal(300); //一次取款300if(account.getBalance() < 0) {System.out.println("超出预支了!");}}}//定义一个取款的方法让两人取款private void makeWithdrawal(int amount) {if(account.getBalance() >= amount) {System.out.println(Thread.currentThread().getName()+ "准备取款");try{System.out.println(Thread.currentThread().getName() + "准备进入不执行状态");Thread.sleep(500); //让boy线程睡眠} catch(InterruptedException ex) {ex.printStackTrace();}System.out.println(Thread.currentThread().getName() + "进入活动状态");account.withdraw(amount);System.out.println(Thread.currentThread().getName() + "完成取款");}else {System.out.println("对不起," + Thread.currentThread().getName() + ",没钱了,取不到钱");}}}
输出结果:
GirlFriend准备取款BoyFriend准备取款GirlFriend准备进入不执行状态BoyFriend准备进入不执行状态BoyFriend进入活动状态BoyFriend完成取款BoyFriend准备取款BoyFriend准备进入不执行状态GirlFriend进入活动状态GirlFriend完成取款GirlFriend准备取款GirlFriend准备进入不执行状态BoyFriend进入活动状态BoyFriend完成取款BoyFriend准备取款BoyFriend准备进入不执行状态GirlFriend进入活动状态GirlFriend完成取款GirlFriend准备取款GirlFriend准备进入不执行状态GirlFriend进入活动状态GirlFriend完成取款对不起,GirlFriend,没钱了,取不到钱BoyFriend进入活动状态BoyFriend完成取款超出预支了!对不起,BoyFriend,没钱了,取不到钱超出预支了!对不起,BoyFriend,没钱了,取不到钱超出预支了!对不起,GirlFriend,没钱了,取不到钱超出预支了!
修改后,运行结果中不会出现“超出预支”这个情况了.