一.线程定时器
eg:
package com.it;
import java.util.*;
public class TraditionalTimer {
private static int count = 0;
@SuppressWarnings("deprecation")
public static void main(String[] args){
class MyTimer extends TimerTask{
@Override
public void run() {
count = (count+1)%2;
System.out.println("bomning!");
new Timer().schedule(new MyTimer(),2000+2000*count);
}
}
new Timer().schedule(new MyTimer(), 2000);// 每隔2秒调度与4秒调度
while(true){
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
二.线程共享变量ThreadLoad
eg:
package com.it;
import java.io.UnsupportedEncodingException;
/***
* 线程范围共享数据 缓存 HashMap 但API 封装这样的工具具体实现类 Threadlocal
*/
import java.util.Random;
public class ThreadLocalDemo {
static class Person{
private int age;
private String student;
private static Person intances = null;
private static ThreadLocal<Person> threadlocal = new ThreadLocal<Person>();
private Person(){
}
public static Person getInstance(){
intances = threadlocal.get();
if(intances==null){
if(intances==null){
synchronized(Person.class){
intances = new Person();
threadlocal.set(intances);
}
}
}
return intances;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getStudent() {
return student;
}
public void setStudent(String student) {
this.student = student;
}
public String toString(){
return this.getAge()+";"+this.getStudent();
}
}
//static ThreadLocal<Person> threadLocal = new ThreadLocal<Person>();
class A{
public void get(){
Person person = Person.getInstance();
System.out.println("A from "+Thread.currentThread().getName()+" get data "+person.getAge());
}
}
class B{
public void get(){
Person person = Person.getInstance();
System.out.println("B from "+Thread.currentThread().getName()+" get data "+person.getStudent());
}
}
class CreateHexToString{
public String generiationHex(int HexLen){
StringBuilder buff = new StringBuilder();
Random random = new Random();
int hightpos,lowpos;
byte[] b = new byte[2];
for(int i=0;i<HexLen;i++){
hightpos = (176+Math.abs(random.nextInt(39)));
lowpos = (161+Math.abs(random.nextInt(93)));
b[0] = (new Integer(hightpos).byteValue());
b[1] = (new Integer(lowpos).byteValue());
try {
buff.append(new String(b,"GBK"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return buff.toString();
}
}
public static void main(String[] args) {
for(int i=0;i<10;i++){
new Thread(new Runnable(){
@Override
public void run() {
int age = new Random().nextInt(10)+20;
String name = new ThreadLocalDemo().new CreateHexToString().generiationHex(2);
Person person= Person.getInstance();
person.setAge(age);
person.setStudent(name);
System.out.println(Thread.currentThread().getName()+" get data "+person);
//threadLocal.set(person);
new ThreadLocalDemo().new A().get();
new ThreadLocalDemo().new B().get();
}
}).start();
}
}
}
三.Thread原子性操作
eg:
package com.it;
public class MultiThreadShareData {
class ShareData{
private int j;
protected ShareData(int j){
this.j = j;
}
public synchronized void increment(){
System.out.println(Thread.currentThread().getName()+" ::: "+(++j));
}
public synchronized void decrement(){
System.out.println(Thread.currentThread().getName()+" ::: "+(--j));
}
}
class Incr implements Runnable{
private ShareData share;
protected Incr(ShareData share){
this.share = share;
}
@Override
public void run() {
share.increment();
}
}
class Decr implements Runnable{
private ShareData share;
protected Decr(ShareData share){
this.share = share;
}
@Override
public void run() {
share.decrement();
}
}
public static void main(String[] args) {
final ShareData share = new MultiThreadShareData().new ShareData(100);
new Thread(new MultiThreadShareData().new Incr(share)).start();
new Thread(new MultiThreadShareData().new Decr(share)).start();
new Thread(new Runnable(){
@Override
public void run() {
share.increment();
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
share.decrement();
}
}).start();
}
}
也可以用JDK1.5并发库的java.util.concurrent.atomic包 完成原子性操作