,创建新执行线程有两种方法:一种方法是将类声明为Thread的子类,子类应重写Thread类的run方法,接下来就可以分配并启动该子类的实例start()使线程开始执行java虚拟机调用该线程的run方法
Thread。currentThread()返回线程对象
getName()获取线程名称,
A,设置线程名称:setName()或构造函数
创建线程的第一种方式:继承Thread类
class Demo extends Thread//继承Thread类
{private String name;
Demo(String name)
{this.name=name;
}
public void run()//重写run方法
{
for(int x=0;x<10;x++)
//返回线程的名字
{System.out.println((Thread.currentThread().getName()+"run....."+x);
}
}
}
class ThreadDemo
{
public static void main(String[] args) {
//创建线程
Demo p=new Demo("lisi");
Demo p1=new Demo("zhangsan");
//开启线程
p.start();
p1.start();
for(int x=0;x<10;x++)
{System.out.println("thread run"+x);}
}
}
B,创建线程的第二种方式:实现runnable接口
class Ticket implements Runnable{//实现Runnable接口
private int tick=100;
public void run()//重写Run方法
{while(true)
{if(tick>0)
{//返回线程对象名称
System.out.println(Thread.currentThread().getName+"...."+tick--)
}
}
}
}
class TicketDemo{
public static void main(String[] args) {
Ticket t=new Ticket();//创建对象
Thread t1=new Thread(t);//创建线程与对象关联
Thread t2=new Thread(t);//创建线程与对象关联
//开启线程
t1.start();
t2.start();
}
}
从以上可以看出实现方式和继承方式的区别:避免啦单继承的局限性
C,线程出现的问题:当多条线程在操作同一线程共享数据时一个线程对象语句只执行一部分还没有执行完另一线程参与进来执行,导致共享数据的错误,
解决方案同步
同步的前提:1,必须要有两个或两个以上的线程2,必须是多个线程使用同一个锁,必须保证同步中只有一个线程执行
同步有两种表现形式:同步代码块和同步函数
同步函数使用的锁是:所属对象的引用那么锁就是this
同步函数被静态修饰后用的锁是:静态进内存时内存中没有本类对象但是一定有该类对应的字节码文件对象
所以锁是类名.class
懒汉式:
class Single
{ //创建引用
private static Single s=null;
//将构造函数私有化
private Single()
{
}
//提供一个方法可以获取该对象
public static Single getInstance()
{
if(s==null)
{//不加锁会导致线程不安全所以需要加synchronized,双重判断
synchronized(Single.class)//静态同步:类名.class
{if(s==null)
//方法被调用时才初始化
s=new Single();
}
}
return s;
}
}
用来验证同步函数使用的是this锁的实例。
class Ticket implements Runnable//实现Runnable接口
{ private static int tick=100;
public void run(){//重写run方法
while(true){
this.show();
}
}
public static synchronized void show()//使用的是this锁
{
if(tick>0)
{
System.out.println(Thread.currentThread().getName()+"....code ;"+tick--);
}
}
class ThreadDemo
{
public static void main(String[] args)
{ Ticket p=new Ticket();//创建对象
Thread p1=new Thread(p);//创建一个线程
Thread p2=new Thread(p);//创建一个线程
//开启线程
p1.start();
p2.start();
}
} |
|