package com.swust.deamon;
/**
* 简单的多线程应用
* @author Administrator
*
*/
public class ThreadDemo extends Thread {
// 重写run方法
@Override
public void run(){
for (int i=0;i<5;i++){
computer();
}
}
//main方法产生的两个线程和初始解释器线程加在一起三个一起执行
public static void main(String[] args){
//创建线程
ThreadDemo firstThread = new ThreadDemo();
//ThreadDemo secondThread = new ThreadDemo();
Thread secondThread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i =0;i<5;i++){
computer();
}
}
});
//设置这两个线程的属性
if(args.length >= 1){
//setPriority是设定线程的优先级
firstThread.setPriority(Integer.parseInt(args[0]));
}
if(args.length >= 2){
secondThread.setPriority(Integer.parseInt(args[1]));
}
//启动线程
firstThread.start();
secondThread.start();
// 设定main函数内部线程
for(int i=0;i<5;i++){
computer();
}
}
/*
* set方法将每个线程中的副本的值设定为指定的值
* get方法可以获取每个线程中的副本的值
* */
static ThreadLocal numcalls = new ThreadLocal<>();//用于记录每个线程调用computer方法的次数
/*
* sychronized 关键字 代表这个方法加锁 相当于不管是哪一个线程运行到这个方法时都要检查有没有其他线程
* 正在使用这个方法,如果有的话需要等待当前线程执行完后再调用该方法。
* */
static synchronized void computer(){
// 计算当前线程被调用的次数
Integer n = (Integer) numcalls.get();
if(n==null){
n = new Integer(1);
}else
n = new Integer(n.intValue()+1);
numcalls.set(n);
//显示线程的名称及其调用次数
System.out.println(Thread.currentThread().getName()+": "+n);
// 模拟线程所产生的最大计算量
for(int i=0,j=0;i<100000;i++){
j+=i;
try {
//线程休眠
Thread.sleep((int)Math.random()*100+1);
} catch (InterruptedException e) {
// TODO: handle exception
}
}
Thread.yield();//当前线程暂停并允许其他线程执行,因此不会有饥饿线程
}
}