public class ThreadDemo {
public static void main(String[] args) {
//匿名多线程,只使用一次
new Thread()
{
///代码
}.start();
}
}
package javademo.xiancheng;
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
HelloThread h1 = new HelloThread("Thread: 1");
h1.start();
Thread.currentThread().setName("主线程");//给主线程命名
for (int i = 0; i < 100; i++) {
if (i %2 == 0)
{
System.out.println(Thread.currentThread().getName()+": "+i);
}
if (i == 20)
{
h1.join();//当主线程执行到20时候,就去执行h1线程了直到执行完
}
}
System.out.println(h1.isAlive());//判断h1线程是否还存在
}
}
class HelloThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0)
{
// try {
// sleep(100);//睡眠时间1000=1s
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
System.out.println(Thread.currentThread().getName()+": "+i);
}
if (i % 20 ==0)
{
yield();//释放当前cpu的执行权
}
}
}
public HelloThread(String name)//构造器给线程命名
{
super(name);
}
}
package javademo.xiancheng;
/*
线程优先级:
MAX_PRIORITY: 10
MIN_PRIORITY: 1
NORM_PRIORITY: 5 --->默认优先级
getPriority():获取线程优先级
setPriority(int p):设置线程优先级,在start前设置
说明:高优先级的线程要抢占低优先级线程的cpu的执行权,但是是从概率上讲,并不会高优先级就一定全部先执行
*/
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
HelloThread h1 = new HelloThread("Thread: 1");
h1.setPriority(Thread.MAX_PRIORITY);//10
h1.start();
Thread.currentThread().setName("主线程");//给主线程命名
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
for (int i = 0; i < 100; i++) {
if (i %2 == 0)
{//getPriority获取优先级,在主线程中得加上“Thread.currentThread()”这些
System.out.println(Thread.currentThread().getName()+": "+i+": "+Thread.currentThread().getPriority());
}
}
}
}
class HelloThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0)
{
System.out.println(getName()+": "+i+": "+getPriority());
}
}
}
public HelloThread(String name)//构造器给线程命名
{
super(name);
}
}
Runnable方法:
天然共享
package javademo.xiancheng.ticket;
class Winidow1 implements Runnable
{
private int ticket = 100;
@Override
public void run() {
while(true)
{
if (ticket > 0)
{//因为不是thread的子类所以无法直接调用getName()方法
System.out.println(Thread.currentThread().getName()+"票号为:"+ticket);
ticket--;
}
else {
break;
}
}
}
}
public class WindowText {
public static void main(String[] args) {
Winidow1 w1 = new Winidow1();
Thread t1 = new Thread(w1);
Thread t2 = new Thread(w1);
Thread t3 = new Thread(w1);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
比较创建线程的两种方式:
开发中:优先选择:实现Runnable方法
原因:1.实现的方式没有类的单继承性的局限性
2.实现的方式更适合来处理多个线程有共享数据的情况
要求:多个线程必须共用同一把锁。
包含时不能多也不能少。
package javademo.xiancheng.ticket;
class Winidow1 implements Runnable
{
private int ticket = 100;
Object obj = new Object();//不能放到run方法里面否则就不算是一个锁了,变成三个了
@Override
public void run() {
while(true) {
synchronized (obj) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (ticket > 0) {//因为不是thread的子类所以无法直接调用getName()方法
System.out.println(Thread.currentThread().getName() + "票号为:" + ticket);
ticket--;
} else {
break;
}
}
}
}
}
public class WindowText {
public static void main(String[] args) {
Winidow1 w1 = new Winidow1();
Thread t1 = new Thread(w1);
Thread t2 = new Thread(w1);
Thread t3 = new Thread(w1);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
更方便的方法:使用this//Thread不行并且this得同一个才可以
Thread类的解决方法:
package javademo.xiancheng.ticket;
class Window2 extends Thread
{
private static int ticket = 100;
static Object obj = new Object();//static使得她们为同一个
@Override
public void run() {
while(true) {
synchronized (obj) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (ticket > 0) {//因为不是thread的子类所以无法直接调用getName()方法
System.out.println(Thread.currentThread().getName() + "票号为:" + ticket);
ticket--;
} else {
break;
}
}
}
}
}
public class WindowTextT {
public static void main(String[] args) {
Window2 t1 = new Window2();
Window2 t2 = new Window2();
Window2 t3 = new Window2();
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
要考虑唯一
类也是对象
notify()唤醒对方
wait()等待