@IntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
public class String_transform {
public static void main(String[] args) {
//基本数据类型转包装类
//方式1: static String valueOf(int a)
String s = String.valueOf(10);
System.out.println(s+1);
//方式2:+""
int i = 10;
String s1 = i+"";
System.out.println(s1+1);
}
}
3.2 String转成基本数据类型
java复制代码
每一个包装类中都有一个parseXXX的方法
位置
方法
说明
Byte
static byte parseByte(String s)
将字符串转成byte
Short
static short parseShort(String s)
将字符串转成short
Integer
static int parseInt(String s)
将字符串转成int
Long
static long parseLong(String s)
将字符串转成long
Float
static float parseFloat(String s)
将字符串转成float
Double
static double parseDouble(String s)
将字符串转成double
Boolean
static boolean parseBoolean(String s)
将字符串转成boolean
java复制代码
public class String_transform {
public static void main(String[] args) {
//基本数据类型转包装类
//方式1: static String valueOf(int a)
String s = String.valueOf(10);
System.out.println(s+1);
//方式2:+""
int i = 10;
String s1 = i+"";
System.out.println(s1+1);
//将String转为基本数据类型
int i1 = Integer.parseInt("101");
System.out.println("i1+1 = " + i1+1);
double parseDouble = Double.parseDouble("10.2");
System.out.println("parseDouble+1 = " + parseDouble + 1);
}
}
将来开发,我们定义javabean的时候,需要将基本类型的字段(成员变量)定义成包装类类型的
java复制代码
1.将来我们的javabean都是和表对应的
2.针对下面的Student类,创建出来的表
id -> 一般作为表的主键使用,而且主键会自增
name
age
如果主键为自增,我们添加数据时sql语句可以这么写:
insert into student (id,name,age) values (NULL,'柳岩',36);
我们可以用NULL占位(主键自增的列)
而我们将来需要将javabean对象中的数据添加到sql语句中,从而保存到数据库中
包装类型的属性默认值为NULL,所以到时候我们将javabean对象中的数据放到数据库中时,我们不需要单独为id属性赋值
如果不给javabean中的id赋值: Student s = new Student(null,"哈哈",36)
此时我们将javabean中的属性值获取出来放到sql中,正好是:
insert into student (id,name,age) values (NULL,'哈哈',36);
java复制代码
public class User {
private Integer uid;
private String name;
private Integer age;
public User(Integer uid, String name, Integer age) {
this.uid = uid;
this.name = name;
this.age = age;
}
public User() {
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
④调用Thread中的start方法(使线程开始执行 ; Java虚拟机会调用线程中的 run 方法)
java复制代码
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("我是MyThread....");
}
}
}
java复制代码
public class Test01 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start(); //开启线程 , jvm自动调用重写的run方法
for (int i = 0; i < 3; i++) {
System.out.println("我是主线程...");
}
}
}
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 3; i++) {
Thread.sleep(1000l);
System.out.println(getName()+"线程正在执行....");
//getName() 获取线程名字 因为继承了Thread,可以直接调用
}
}
}
java复制代码
public class Test01 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start(); //开启线程 , jvm自动调用重写的run方法
myThread.setName("haha"); //修改线程名字
for (int i = 0; i < 3; i++) {
Thread.sleep(1000l); //线程睡眠1秒
System.out.println(Thread.currentThread().getName()+"线程正在执行..."); //static Thread currentThread() 获取的是当前正在执行的线程对象
}
}
}
public class MyThread_implements implements Runnable{
@Override
public void run() {
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()+"线程正在执行....");
}
}
}
java复制代码
public class Test02 {
public static void main(String[] args) throws InterruptedException {
MyThread_implements myThread_implements = new MyThread_implements();
Thread thread = new Thread(myThread_implements);
thread.start();
for (int i = 0; i < 3; i++) {
Thread.sleep(100l);
System.out.println(Thread.currentThread().getName()+"线程正在执行...");
}
}
}
匿名内部类回顾:一种格式代表子类对象或实现类对象
使用:
new 接口/抽象父类(){
重写方法
}.重写的方法();
接口/抽象类 对象名 = new 接口/抽象父类(){
重写方法
}
对象名.重写的方法();
java复制代码
public class Test03Niming {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()+"匿名线程正在执行...");
}
}
}).start();
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()+"主线程正在执行...");
}
}
}
线程安全
问 : 什么时候出现线程安全问题 ?
答 : 当多个线程访问同一个资源时 , 可能会出现线程安全问题
1.线程安全问题 --->线程不安全代码
java复制代码
public class MyTicket implements Runnable{
int ticket = 100;
@Override
public void run() {
while(true){
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (ticket>0){
System.out.println(Thread.currentThread().getName()+"买了第"+ticket+"张票");
}
ticket--;
}
}
}
java复制代码
public class Test01 {
public static void main(String[] args) {
MyTicket myTicket = new MyTicket();
Thread thread1 = new Thread(myTicket,"柳岩");
Thread thread2 = new Thread(myTicket,"涛哥");
Thread thread3 = new Thread(myTicket,"金莲");
thread1.start();
thread2.start();
thread3.start();
}
}
public class Ticket implements Runnable{
Integer ticket = 50;
@Override
public void run() {
while (true){
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (this){
if(ticket > 0){
System.out.println(Thread.currentThread().getName()+"抢到了第"+ticket+"张票");
ticket--;
}else{
return ;
}
}
}
}
}
java复制代码
public class Test04 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread t1 = new Thread(ticket, "张三");
Thread t2 = new Thread(ticket, "李四");
Thread t3 = new Thread(ticket, "王五");
t1.start();
t2.start();
t3.start();
}
}
3.解决线程安全问题的第二种方式:同步方法
3.1.普通同步方法
java复制代码
1.格式:
public synchronized 返回值类型 方法名(参数){
方法体
return 结果
}
public 返回值类型 方法名(参数){
synchronized(this){
方法体
return 结果
}
}
2.默认锁:this
java复制代码
public class Ticket1 implements Runnable{
Integer ticket = 50;
@Override
public void run() {
while (true){
try {
Thread.sleep(100l);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
method();
if(ticket == 0){
return;
}
}
}
/*
//采用synchronized同步方法
public synchronized void method(){
if(ticket > 0){
System.out.println(Thread.currentThread().getName()+"抢到了第"+ticket+"张票");
ticket--;
}
}*/
public void method(){
synchronized (this){
if(ticket > 0){
System.out.println(Thread.currentThread().getName()+"抢到了第"+ticket+"张票");
ticket--;
}
}
}
}
java复制代码
public class Test05 {
public static void main(String[] args) {
Ticket1 ticket1 = new Ticket1();
Thread t1 = new Thread(ticket1, "张三");
Thread t2 = new Thread(ticket1, "李四");
Thread t3 = new Thread(ticket1, "王五");
t1.start();
t2.start();
t3.start();
}
}
public class Ticket2 implements Runnable{
static Integer ticket = 50;
@Override
public void run() {
while (true){
try {
Thread.sleep(100l);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
method();
if(ticket == 0){
return;
}
}
}
/*
//采用synchronized同步方法
public static synchronized void method(){
if(ticket > 0){
System.out.println(Thread.currentThread().getName()+"抢到了第"+ticket+"张票");
ticket--;
}
}*/
public static void method(){
synchronized (Ticket2.class){
if(ticket > 0){
System.out.println(Thread.currentThread().getName()+"抢到了第"+ticket+"张票");
ticket--;
}
}
}
}
java复制代码
public class Test06 {
public static void main(String[] args) {
Ticket2 ticket2 = new Ticket2();
Thread t1 = new Thread(ticket2, "张三");
Thread t2 = new Thread(ticket2, "李四");
Thread t3 = new Thread(ticket2, "王五");
t1.start();
t2.start();
t3.start();
}
}
public class Test01 {
public static void main(String[] args) {
DieLock dieLock1 = new DieLock(true);
DieLock dieLock2 = new DieLock(false);
new Thread(dieLock1).start();
new Thread(dieLock2).start();
}
}
~~~java
public class Test01 {
public static void main(String[] args) {
DieLock dieLock1 = new DieLock(true);
DieLock dieLock2 = new DieLock(false);
new Thread(dieLock1).start();
new Thread(dieLock2).start();
}
}