package com.jia.threadtest;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.jia.blankaccount.Account;
import com.jia.blankaccount.DrawThread;
/**
* 获取当前线程Thread.currentThread()
* join()方法,调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的线程执行完为止
* setDaemon(true)方法将指定线程设为后台线程
* isDaemon()方法判断指定线程是否为后台进程
* 调用Thread.sleep(1)方法让当前线程暂停1ms
* 调用Thread.yield()方法是暂停一下当前线程,使当前线程转为就绪状态,重新调度()
* Thread.yield()同Thread.sleep(1)相似,都是使当前线程暂停,
* 不同点:Thread.sleep(1)使当前线程阻塞,Thread.sleep(1)不会阻塞,还可能继续执行此线程
* 改变线程优先级:d.setPriority(2)数值越大,优先级越高
* 同步代码块synchronized(obj){}与同步方法,
* 同步方法,无须显示指定同步监视器,同步方法的同步监视器是this,也就是该对象本身
* 同步锁private final ReentrantLock lock = new ReentrantLock();
* 对同步锁进行加锁lock.lock();
* 使用finally确保释放锁finally{lock.unlock();}
* 线程池:系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互。在这种情况下,使用线程池可以很好的提高性能,
* 尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池
* 1.创建一个具有固定线程数的线程池ExecutorService pool = Executors.newFixedThreadPool(6);
* 2.向线程池中提交一个线程pool.submit(new DrawThread("甲", account, 800));
* 3.关闭线程池pool.shutdown();
*/
public class DemoThread extends Thread
{
public void run()
{
for (int i = 0; i < 100; i++ )
{
System.out.println(getName() + " " + i);
Thread.yield();
}
}
public static void main(String[] args) throws InterruptedException
{
//线程的优先级和后台线程
threadYouxianji();
//使用线程池
threadPool();
}
/**
* 使用线程池执行线程任务
*/
public static void threadPool()
{
//创建一个账户
Account account = new Account("123456",1000);
//创建一个具有固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(6);
//向线程池中提交5个线程
pool.submit(new DrawThread("甲", account, 800));
pool.submit(new DrawThread("乙", account, 100));
pool.submit(new DrawThread("丙", account, 100));
pool.submit(new DrawThread("丁", account, 100));
pool.submit(new DrawThread("卯", account, 800));
//关闭线程池
pool.shutdown();
}
/**
* 线程的优先级和后台线程
*/
public static void threadYouxianji()
{
DemoThread d = new DemoThread();
//将指定线程设为后台线程
d.setDaemon(true);
d.setPriority(2);
d.start();
d.isDaemon();
//改变主线程的优先级
Thread.currentThread().setPriority(6);
for (int i = 0; i < 10; i++)
{
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.jia.blankaccount.Account;
import com.jia.blankaccount.DrawThread;
/**
* 获取当前线程Thread.currentThread()
* join()方法,调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的线程执行完为止
* setDaemon(true)方法将指定线程设为后台线程
* isDaemon()方法判断指定线程是否为后台进程
* 调用Thread.sleep(1)方法让当前线程暂停1ms
* 调用Thread.yield()方法是暂停一下当前线程,使当前线程转为就绪状态,重新调度()
* Thread.yield()同Thread.sleep(1)相似,都是使当前线程暂停,
* 不同点:Thread.sleep(1)使当前线程阻塞,Thread.sleep(1)不会阻塞,还可能继续执行此线程
* 改变线程优先级:d.setPriority(2)数值越大,优先级越高
* 同步代码块synchronized(obj){}与同步方法,
* 同步方法,无须显示指定同步监视器,同步方法的同步监视器是this,也就是该对象本身
* 同步锁private final ReentrantLock lock = new ReentrantLock();
* 对同步锁进行加锁lock.lock();
* 使用finally确保释放锁finally{lock.unlock();}
* 线程池:系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互。在这种情况下,使用线程池可以很好的提高性能,
* 尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池
* 1.创建一个具有固定线程数的线程池ExecutorService pool = Executors.newFixedThreadPool(6);
* 2.向线程池中提交一个线程pool.submit(new DrawThread("甲", account, 800));
* 3.关闭线程池pool.shutdown();
*/
public class DemoThread extends Thread
{
public void run()
{
for (int i = 0; i < 100; i++ )
{
System.out.println(getName() + " " + i);
Thread.yield();
}
}
public static void main(String[] args) throws InterruptedException
{
//线程的优先级和后台线程
threadYouxianji();
//使用线程池
threadPool();
}
/**
* 使用线程池执行线程任务
*/
public static void threadPool()
{
//创建一个账户
Account account = new Account("123456",1000);
//创建一个具有固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(6);
//向线程池中提交5个线程
pool.submit(new DrawThread("甲", account, 800));
pool.submit(new DrawThread("乙", account, 100));
pool.submit(new DrawThread("丙", account, 100));
pool.submit(new DrawThread("丁", account, 100));
pool.submit(new DrawThread("卯", account, 800));
//关闭线程池
pool.shutdown();
}
/**
* 线程的优先级和后台线程
*/
public static void threadYouxianji()
{
DemoThread d = new DemoThread();
//将指定线程设为后台线程
d.setDaemon(true);
d.setPriority(2);
d.start();
d.isDaemon();
//改变主线程的优先级
Thread.currentThread().setPriority(6);
for (int i = 0; i < 10; i++)
{
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}