//后台进程
/*
* 对于java来说只要还有一个前台线程在运行,这个进程就不结束,如果一个进程
* 只有后台线程,这个进程就会结束
*/
package xian_cheng;
public class Example06 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("main线程是后台线程吗?"+Thread.currentThread().isDaemon());
DamonThtead dt=new DamonThtead();//创建一个DamonThread对象dt;
Thread t=new Thread(dt,"后台线程");//创建线程t共享dt资源
System.out.println("t线程是后台线程吗?"+t.isDaemon());//java默认的是前台进程
/*
*注意要将某个线程设置为后台线程,必须在该线程启动之前
*t.setDaemon(true);语句必须位于t.start之前
*/
t.setDaemon(true);//将线程t设置为后台线程
t.start(); //开启线程
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
class DamonThtead implements Runnable{
public void run(){
while (true) {
System.out.println(Thread.currentThread().getName()
+"------is running");
}
}
}
//线程的优先级
package xian_cheng;
import java.security.PublicKey;
public class Example07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread minThread=new Thread(new MinPriority(),"优先级较低的线程");
Thread maxThread=new Thread(new MaxPriority(),"优先级较gao的线程");
minThread.setPriority(Thread.MIN_PRIORITY);
maxThread.setPriority(10);
maxThread.start();
minThread.start();
}
}
//定义类MaxPriority实现Runnable接口
class MaxPriority implements Runnable{
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+
"正在输出:"+i);
}
}
}
//定义类MinPriority实现Runnable接口
class MinPriority implements Runnable{
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+
"正在输出:"+i);
}
}
}
/线程的休眠
package xian_cheng;
/*
* 线程的休眠,它能使线程进入阻塞状态
* sleep方法声明抛出InterruptedException异常
* 当线程调用sleep()方法后在指定的时间内该线程是不会执行的
* sleep()是静态方法只能控制当前正在运行的线程
*
*/
public class Example08 {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Thread thread=Thread.currentThread();
System.out.println(thread.getName());
new Thread(new SleepThread()).start();
for (int i = 0; i < 10; i++) {
if (i==5) {
Thread.sleep(2000);
}
System.out.println("主线程正在输出:"+i);
Thread.sleep(500);
}
}
}
class SleepThread implements Runnable{
public void run(){
for (int i = 0; i < 10; i++) {
if (i==3) {
try {
Thread.sleep(2000);//当前线程休眠2秒
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
System.out.println("线程一正在输出:"+i);
try {
Thread.sleep(2000);//当前线程休眠2秒
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
/线程让步
package xian_cheng;
/*
* 线程让步通过yield()方法来实现,与sleep()的区别是它不会阻塞该线程,
* 只是将线程转换为就绪状态
*/
public class Example09 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1=new YieldThread("线程A");
Thread t2=new YieldThread("线程B");
t1.start();
t2.start();
}
}
class YieldThread extends Thread{
public YieldThread(String name){
super(name);//调用父类的构造方法
}
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"---"+i);
if (i==3) {
System.out.print("线程让步:");
Thread.yield();//线程做出让步
}
}
}
}
/线程同步
package xian_cheng;
/*
* 线程同步
*/
public class Example12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Ticket1 ticket1=new Ticket1();
new Thread(ticket1,"窗口1").start();
new Thread(ticket1,"窗口2").start();
new Thread(ticket1,"窗口3").start();
}
}
class Ticket1 implements Runnable{
private int tickets=10;
Object look=new Object();//定义一个对象作为同步代码块的锁
/*
* 注意锁对象的创建代码不能放在run方法中,否者每个线程运行到run()方法都会
* 创建一个锁,这样每个线程都有一个不同的锁,每一个锁都有一个自己的标志位。
* 线程之间便不能产生同步的效果
*/
public void run(){
while (true) {
synchronized (look) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
if (tickets>0) {
System.out.println(Thread.currentThread().getName()
+"---卖出的票"+tickets--);
}else {
break;
}
}
}
}
}